Win10/UWP新特性—SharedStorageAccessManager 共享文件

首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发!

在UWP开发中,微软提供了一个新的特性叫做SharedStorageAccessManager,它允许我们的App根据指定的文件生成一个FileToken来共享此文件,其他App可以使用SharedStorageAccessManager. RedeemTokenForFileAsync(fileToken);方法根据FileToken来获取到共享的文件。这样两个App之间就具备了共享文件的能力。

我们先看下SharedStorageAccessManager类中都具有哪些Api可供我们使用:


方法


描述


AddFile


获取一个文件共享Token,使应用程序能够与另一个应用程序共享指定的文件。


RedeemTokenForFileAsync


另一个应用程序通过一个文件共享Token来使用此文件。


RemoveFile


撤销现有的共享Token。

SharedStorageAccessManager功能的使用步骤大致分为以下三个步骤:

  • 源App使用AddFile方法来获取共享文件的共享Token字符串
  • 通过LaunchUriAsync的方式启动接收者App并传递该Token
  • 接收者App通过调用RedeemTokenForFileAsync方法来获取共享的文件

可以看出使用SharedStorageAccessManager共享一个文件还是挺方便的,但是需要注意的是,SharedStorageAccessManager的使用还是有一定的限制的:

  • 共享的Token有效期只有一次,也就是说被其他应用RedeemTokenForFileAsync后就失效了
  • 如果共享的Token一直没有其他App调用RedeemTokenForFileAsync,那么将会在14天之后过期失效
  • 每个App分享出去的Token个数不能超过1000个,但是当Token一旦被其他App Redeem兑换、Remove、或者过期失效后将不会被计数到Token的数量限制(1000个)中

接下来我们就做个简单的例子来看一下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属性上即可

最终效果:

时间: 2024-10-08 12:26:58

Win10/UWP新特性—SharedStorageAccessManager 共享文件的相关文章

Win10/UWP新特性—Drag&amp;Drop 拖出元素到其他App

在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop App & UWP App中.昨天重新研究了Win10 拖拽这一块,发现以前没能实现的功能,在正式版的环境下都可以实现了,做个笔记以防日后忘记. 在UWP中,想要拖动元素到Desktop或者另一个UWP App中,除了设置元素的CanDrag="True"我们要使用元素的DragSt

Win10/UWP新特性系列—Launcher实现应用间的通信

UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器.App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用. 一:Launcher.LaunchFolde

Win10/UWP新特性系列-GetPublisherCacheFolder

微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的. 在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容.例如,多个应用程

Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能.使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中. 下面是个例子,我们需要打印一个购物清单,前台代码如下: 1 <Page.Resource

Win10/UWP新特性系列—电池报告

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息. 通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电.容量和状态. 需要用到的资源: Battery:提供该设备的电池控制器信息类

atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 1 1.3. 很少损坏不能启动(只有一次,2年,多机) 1 1.4. PC也可以触摸 1 2. win8 新特性 2 2.1. 2012年2月29日 2 2.2. Metro界面跨平台(移动平台,) 2 2.3. 本文导航 2 2.4. U盘上也可运行 2 3. win9 新特性 3 3.1. wi

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.

UWP/Win10新特性系列—App Service

Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Api. 通过对外提供服务的形式,可以使App更好的完成一些其他App所拥有的专业性操作,而不必自己再去实现服务所做的操作.一些企业用户可以提供复杂的服务,比如云识别和云存储来供开发者使用.这样使开发成本大大降低,也可以为服务提供商带来更多的用户.比如我们可以调用二维码识别服务(如下图,假设其他App提

【UWP通用应用开发】开发准备、部分新特性

准备 操作系统.SDK 不知道大家有没有升级到Windows 10呢,我从第一个预览版一直用到现在了,虽然还不够稳定,不过也足够了.尤其在11月更新之后,已经非常不错了. 操作系统大家可以直接升级到Windows 10,也可以去官网下载镜像自行安装,还可以在DreamSpark等地方下载.DreamSpark上除了Office外其他诸如操作系统.开发工具及其他软件对学生均免费开放. Visual Studio系列作为地球上最强大的IDE,学习UWP开发自然也是少不了的,2015版虽然稳定性不如之