博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【uwp】浅谈China Daily中数据同步到One Drive的实现
阅读量:5130 次
发布时间:2019-06-13

本文共 4251 字,大约阅读时间需要 14 分钟。

与旧版相比新增了数据同步的功能,那这个功能具体是如何实现的呢,现在让我们来一起看看。

 

1.注册应用

开发者中心的应用注册就不用多说了()。因为稍后的步骤会涉及到项目与应用关联,所以各位可以先行准备好。

 

2.在应用中添加相应的Nuget包

创建工程的部分就不用我赘述了,要是不会的……自个儿撞墙去吧(ˉ▽ˉ;)...

特别说明:安装Microsoft.OneDriveSDK的1.x版本!!

OneDriveSDK的2.x版本和1.x版本有较大程度的差异。很尴尬的是,对于2.x版本的正确使用方式,鄙人还未能掌握,所以本文皆是以1.x版本的API进行的讲解(个人使用的是1.2.0版本SDK)。

(PS: 如果觉得这种安装方式太low了,可以通过View -> Other Windows -> Package Manager Console安装,PM> Install-Package Microsoft.OneDriveSDK -Version 1.2.0)

 

 3.应用关联

将应用程序与应用商店相关联

关联完成后,准备工作就算是做完了。

 

4.SDK的具体使用

OneDriveSDK在China Daily中的应用,总体来说分两步走:1.身份验证 2.通过上传、下载等方法实现数据同步的功能。

说明:我创建了一个OneDriveUtil的静态类,并在类里面实现身份验证、上传、下载的方法。所以下述(方法调用部分除外)的字段、方法都使用了static关键字进行限制。

1)部分全局变量

// Clientprivate static IOneDriveClient _client;// 所请求的权限private static string[] scopes = new string[] { "onedrive.readwrite", "wl.offline_access", "wl.signin" };

 

至于权限的详细信息,请参见微软相关文档

 

2)身份验证

/// /// 身份验证/// /// 
public static async Task
LogInAsync(){ try { _client = OneDriveClientExtensions.GetUniversalClient(scopes); var session = await _client.AuthenticateAsync(); return session != null; } catch (OneDriveException ex) { Debug.WriteLine(ex.Message); return false; }}

OneDriveSDK是十分人性化的,因为我们不需要主动管理Session,只需要一个全局的Client即可。 

 

3)上传功能

/// /// 上传文件到OneDrive/// /// 
public static async Task
UploadFileAsync(){ var file = await StorageFile.GetFileFromPathAsync($"ms-appx:///Assets/Images/{fileName}"); return await UploadFileAsync(file, OneDriveFilePath);}///
/// 上传文件到OneDrive/// ///
///
///
private static async Task
UploadFileAsync(StorageFile file, string serverPath){ if (file != null) { var stream = await file.OpenStreamForReadAsync(); var item = await _client .Drive .Root .ItemWithPath(serverPath) .Content .Request() .PutAsync
(stream); return true; } return false;}

 

4)下载功能

/// /// 从OneDrive下载文件/// /// 
public static async Task
DownloadFileAsync(){ return await DownloadFileAsync(OneDriveFilePath);}///
/// 从OneDrive下载文件/// ///
///
private static async Task
DownloadFileAsync(string serverPath){ var item = await _client .Drive .Root .ItemWithPath(serverPath) .Request() .GetAsync(); var stream = await _client .Drive .Items[item.Id] .Content .Request() .GetAsync(); return stream;}

 

5)方法调用

注:代码中的UpdateProgressRing方法(更新进度条显示状态)以及ToastService.SendToast方法(弹框提示),各位不必太在意。

// 备份功能的实现if (await OneDriveUtil.LogInAsync()){    UpdateProgressRing(true, "Uploading data...");    var succeed = await OneDriveUtil.UploadFileAsync();    ToastService.SendToast(succeed ? "Succeed (●'◡'●)" : "Fail (⊙︿⊙)");}
// 同步功能的实现if (await OneDriveUtil.LogInAsync()){    UpdateProgressRing(true, "Downloading data...");    using (var stream = await OneDriveUtil.DownloadFileAsync())    {        await ImportDataAsync(stream);    }}
/// /// 通过文件流导入数据/// /// /// 
public static async Task ImportDataAsync(Stream stream){ if (stream != null) { try { // 这个地方使用了图片库,一定要记得申请相关权限(见下图) var lib = KnownFolders.PicturesLibrary; var file = await lib.CreateFileAsync(OneDriveUtil.fileName, CreationCollisionOption.ReplaceExisting); byte[] buffer = new byte[stream.Length]; await stream.ReadAsync(buffer, 0, buffer.Length); var fs = await file.OpenStreamForWriteAsync(); fs.Write(buffer, 0, buffer.Length); ToastService.SendToast("Succeed (●'◡'●)"); } catch { ToastService.SendToast("Fail (⊙︿⊙)"); } } else { ToastService.SendToast("Fail (⊙︿⊙)"); }}

 

6)初次运行

初次运行时,系统会弹框提示用户是否授权(如图)。如果授权成功,则以后一般都不会再弹出提示,除非身份验证过期。

 

5.Demo

 

6.参考

 Win10开发:OneDrive SDK 的使用 

转载于:https://www.cnblogs.com/lary/p/6752617.html

你可能感兴趣的文章
Oracle中包的创建
查看>>
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>