本文介绍如何使用“共享”合约接收从另一个应用共享的通用 Windows 平台(UWP)应用中的内容。 此共享协定允许在用户调用“共享”时将你的应用显示为选项之一。
注释
本文中的代码示例来自 UWP 应用。 桌面应用应使用 IDataTransferManagerInterop。 有关详细信息和代码示例,请参阅 显示依赖于 CoreWindow 的 WinRT UI 对象。
还可以参考 Windows 应用中的 WPF 共享内容源应用示例 和 集成共享选项 ,了解有关在桌面应用中共享数据的其他信息。
将应用声明为共享目标
当用户调用“共享”时,系统会显示可能的目标应用的列表。 为了显示在列表中,你的应用需要声明它支持“共享”合约。 这让系统知道你的应用可用于接收内容。
- 打开清单文件。 它应该被称为类似于 package.appxmanifest的东西。
- 打开 声明 选项卡。
- 从 可用声明 列表中选择 共享目标,然后选择 添加。
选择文件类型和格式
接下来,确定支持的文件类型和数据格式。 共享 API 支持多种标准格式,例如文本、HTML 和位图。 还可以指定自定义文件类型和数据格式。 如果这样做,请记住源应用必须知道这些类型和格式是什么:否则,这些应用无法使用格式共享数据。
仅注册您的应用可以处理的格式。 当用户调用“共享”时,仅显示支持共享数据的目标应用。
设置文件类型:
- 打开清单文件。 它应该被称为类似于 package.appxmanifest的东西。
- 在 声明 页的 支持的文件类型 部分,选择 新增。
- 键入要支持的文件扩展名,例如“.docx”。需要包括时间段。 如果要支持所有文件类型,请选中 SupportsAnyFileType 复选框。
设置数据格式:
- 打开清单文件。
- 打开 数据格式 部分的 声明 页,然后选择 新增。
- 键入支持的数据格式的名称,例如“Text”。
处理共享激活
当用户从共享 UI 中的可用目标应用列表中选择您的应用时,将引发 OnShareTargetActivated 事件。 你的应用需要处理此事件来处理用户想要共享的数据。
protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
// Code to handle activation goes here.
}
用户想要共享的数据包含在 ShareOperation 对象中。 可以使用此对象检查它包含的数据的格式。
ShareOperation shareOperation = args.ShareOperation;
if (shareOperation.Data.Contains(StandardDataFormats.Text))
{
string text = await shareOperation.Data.GetTextAsync();
// To output the text from this example, you need a TextBlock control
// with a name of "sharedContent".
sharedContent.Text = "Text: " + text;
}
报表共享状态
在某些情况下,应用可能需要一些时间来处理想要共享的数据。 示例包括共享文件或图像集合的用户。 这些项大于简单的文本字符串,因此处理时间更长。
shareOperation.ReportStarted();
调用 ReportStarted后,不要再期望用户与应用交互。 因此,不应调用它,除非你的应用程序处于用户可以关闭的状态。
扩展共享时,用户可能在您的应用程序接收到 DataPackage 对象中的所有数据之前关闭源应用。 因此,我们建议你让系统知道应用何时获取了它所需的数据。 这样,系统就可以根据需要暂停或终止源应用。
shareOperation.ReportSubmittedBackgroundTask();
如果出现问题,请调用 ReportError 向系统发送错误消息。 当用户检查共享的状态时,用户会看到该消息。 此时,你的应用将关闭并且共享已结束。 用户需要再次开始将内容共享到应用。 根据你的场景,你可能会觉得特定错误不足以结束共享操作。 在这种情况下,您可以选择不调用 ReportError,并继续进行共享操作。
shareOperation.ReportError("Could not reach the server! Try again later.");
最后,当应用成功处理共享内容时,应调用 ReportCompleted 让系统知道。
shareOperation.ReportCompleted();
使用这些方法时,通常按描述的顺序调用它们,并且不会多次调用它们。 有时候,在 ReportStarted之前,目标应用可以调用 ReportDataRetrieved。 例如,应用可能会在激活处理程序中检索数据作为任务的一部分,但在用户选择 共享 按钮之前,不会调用 ReportStarted。
如果共享成功,返回一个QuickLink。
当用户选择你的应用来接收内容时,我们建议你创建 QuickLink。 QuickLink 就像一个快捷方式,让用户更容易与你的应用共享信息。 例如,可以创建一个 QuickLink,以打开一封已经预先填写了好友电子邮件地址的新邮件。
QuickLink 必须具有标题、图标和 ID。当用户点击“共享魅力”按钮时,将显示标题(如“电子邮件妈妈”)和图标。 应用使用 ID 来访问任何自定义信息,例如电子邮件地址或登录凭据。 当应用创建 QuickLink时,应用将通过调用 ReportCompleted将 QuickLink 返回到系统。
QuickLink 实际上并不会存储数据。 而是包含一个标识符,该标识符在选中时会发送到应用。 你的应用负责存储 QuickLink 的 ID 以及相应的用户数据。 当用户点击 QuickLink时,可以通过 QuickLinkId 属性获取其 ID。
async void ReportCompleted(ShareOperation shareOperation, string quickLinkId, string quickLinkTitle)
{
QuickLink quickLinkInfo = new QuickLink
{
Id = quickLinkId,
Title = quickLinkTitle,
// For quicklinks, the supported FileTypes and DataFormats are set
// independently from the manifest
SupportedFileTypes = { "*" },
SupportedDataFormats = { StandardDataFormats.Text, StandardDataFormats.Uri,
StandardDataFormats.Bitmap, StandardDataFormats.StorageItems }
};
StorageFile iconFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.CreateFileAsync(
"assets\\user.png", CreationCollisionOption.OpenIfExists);
quickLinkInfo.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile);
shareOperation.ReportCompleted(quickLinkInfo);
}