首先先給你們推薦一個UWP/Win10開發者羣:53078485 裏面有不少大嬸,還有不少學習資源,歡迎你們來一塊兒討論Win10開發!前端
在UWP開發中,微軟提供了一個新的特性叫作SharedStorageAccessManager,它容許咱們的App根據指定的文件生成一個FileToken來共享此文件,其餘App可使用SharedStorageAccessManager. RedeemTokenForFileAsync(fileToken);方法根據FileToken來獲取到共享的文件。這樣兩個App之間就具有了共享文件的能力。app
咱們先看下SharedStorageAccessManager類中都具備哪些Api可供咱們使用:async
方法ide |
描述佈局 |
AddFile學習 |
獲取一個文件共享Token,使應用程序可以與另外一個應用程序共享指定的文件。ui |
RedeemTokenForFileAsyncthis |
另外一個應用程序經過一個文件共享Token來使用此文件。url |
RemoveFilespa |
撤銷現有的共享Token。 |
SharedStorageAccessManager功能的使用步驟大體分爲如下三個步驟:
能夠看出使用SharedStorageAccessManager共享一個文件仍是挺方便的,可是須要注意的是,SharedStorageAccessManager的使用仍是有必定的限制的:
接下來咱們就作個簡單的例子來看一下SharedStorageAccessManager具體的使用方法。
例子:咱們在一個App中共享一個Image文件到另外一個App中
首先建立分享者App,頁面佈局一個圖片和一個分享按鈕以下:
分享者前端XAML:
1 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 2 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 3 <Image Source="Images/img.jpg"/> 4 <Button Click="{x:Bind ShareFileToOtherApp}" Content="分享這個圖片到另外一個App" HorizontalAlignment="Right"/> 5 </StackPanel> 6 </Grid>
分享者分享Button Click方法的實現:
1 private async void ShareFileToOtherApp(object sender, RoutedEventArgs args) 2 { 3 var file = await Package.Current.InstalledLocation.GetFileAsync(@"Images\img.jpg"); 4 5 // 由於圖片正在UI上使用中 因此咱們要另外建立一個該圖片文件的副本進行分享 6 var localFolder = ApplicationData.Current.LocalFolder; 7 var filePath = $"{Guid.NewGuid().ToString("N")}.jpg"; 8 var sampleFile = await localFolder.CreateFileAsync(filePath, CreationCollisionOption.ReplaceExisting); 9 await file.CopyAndReplaceAsync(sampleFile); 10 11 // 獲取要分享的文件的Token 12 var sharingToken = SharedStorageAccessManager.AddFile(sampleFile); 13 14 //設置要分享到的 App 的 Uri 15 var driveTo = new Uri("aran.sharetargetsample:?SharedImgToken=" + sharingToken); 16 var launch = await Launcher.LaunchUriAsync(driveTo); 17 }
分享者的代碼至此完成,是否是很簡單?接下來咱們去作接收者App,因爲咱們是經過Launcher.LaunchUriAsync的方式將Token傳遞到接收者App中,因此咱們須要讓接收者App支持Uri啓動協議
首先建立一個新的項目做爲接收者,而後雙擊打開Package.appxmanifest文件,選擇"聲明"選項卡,添加一個"協議"的聲明,填寫協議聲明的"顯示名稱"和"名稱",例以下圖:
須要注意的是,"名稱"的填寫是不能使用大寫字母的。
這個協議填寫好後保存並運行下咱們的程序來檢查下啓動協議是否聲明成功
咱們依次打開計算機的"控制面板 – 默認程序 – 設置默認程序",若是聲明成功,在程序列表中能夠找到咱們設置的ShareTargetSample程序,點擊"選擇此程序的默認值",就能夠查看到咱們的啓動協議了,以下:
從描述信息中咱們能夠看出咱們的URL爲:aran.sharetargetsample,咱們打開一個文件資源管理器,在文件路徑中鍵入"aran.sharetargetsample:"後回車,這時系統就會經過URL協議激活並啓動咱們的App
完成上面的操做僅僅是可以經過URL激活啓動咱們的程序,那麼怎麼在激活程序時獲取到外界傳遞過來的參數呢?咱們須要在接收者的App.cs裏App類中重寫OnActivated方法來判斷是否由Url協議啓動App,若是是則獲取參數
OnActivated方法代碼以下:
1 protected async override void OnActivated(IActivatedEventArgs args) 2 { 3 base.OnActivated(args); 4 //判斷是否由LaunchUriAsync方式啓動 5 if (args.Kind != ActivationKind.Protocol) return; 6 var protocolArgs = args as ProtocolActivatedEventArgs; 7 8 // 從uri中獲取文件token 9 if (protocolArgs == null) return; 10 var queryStrings = new WwwFormUrlDecoder(protocolArgs.Uri.Query); 11 var sharedImgToken = queryStrings.GetFirstValueByName("SharedImgToken"); 12 13 // 根據該token讀取文件 14 if (string.IsNullOrEmpty(sharedImgToken)) return; 15 var file = await SharedStorageAccessManager.RedeemTokenForFileAsync(sharedImgToken); 16 17 // 本地建立一個File用來接收該文件 18 var localFolder = ApplicationData.Current.LocalFolder; 19 var filePath = $"{Guid.NewGuid().ToString("N")}.jpg"; 20 var sampleFile = await localFolder.CreateFileAsync(filePath, CreationCollisionOption.ReplaceExisting); 21 await file.CopyAndReplaceAsync(sampleFile); 22 23 24 // 獲取頁面引用 25 var root = Window.Current.Content as Frame; 26 if (root == null) 27 { 28 root = new Frame(); 29 Window.Current.Content = root; 30 } 31 // 導航到指定的頁面並傳遞文件路徑 32 root.Navigate(typeof(MainPage), Path.Combine(localFolder.Path, filePath)); 33 // 確保當前窗口處於活動狀態 34 Window.Current.Activate(); 35 }
由於程序有可能被多種方式激活,因此上面的方法中咱們首先要判斷接收者App被激活的類型是否爲ActivationKind.Protocol,而後咱們再根據url中的參數獲取到共享文件的Token值並經過SharedStorageAccessManager.RedeemTokenForFileAsync方法獲得共享的文件(這裏咱們忽略掉App是否已是正在運行中以及忽略跳轉到MainPage頁面是否合理,項目中可根據需求跳轉到其餘頁面)
拿到共享文件後,咱們先保存文件到本身的App根目錄中,而後將文件路徑傳遞到顯示共享文件的頁面並跳轉到該頁面
共享文件顯示頁面的邏輯很簡單,獲取共享文件存放的文件路徑,而後展現該文件,代碼以下:
1 public sealed partial class MainPage : Page, INotifyPropertyChanged 2 { 3 private ImageSource _imgUri; 4 public ImageSource ImgUri 5 { 6 get { return _imgUri; } 7 set 8 { 9 _imgUri = value; 10 SendPropertyChanged(); 11 } 12 } 13 14 public event PropertyChangedEventHandler PropertyChanged; 15 public void SendPropertyChanged([CallerMemberName] string propertyName = null) 16 { 17 var handler = PropertyChanged; 18 handler?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 19 } 20 21 22 public MainPage() 23 { 24 this.InitializeComponent(); 25 } 26 27 protected override void OnNavigatedTo(NavigationEventArgs e) 28 { 29 if (e.Parameter != null && !(string.IsNullOrEmpty(e.Parameter.ToString()) && e.Parameter is string)) 30 { 31 ImgUri = new BitmapImage(new Uri(e.Parameter.ToString(), UriKind.RelativeOrAbsolute)); 32 } 33 base.OnNavigatedTo(e); 34 } 35 }
前臺頁面XAML中放置一個Image元素,綁定Image的Source到後臺ImgUri屬性上便可
最終效果: