接收数据

本文介绍如何使用“共享”合约接收从另一个应用共享的通用 Windows 平台(UWP)应用中的内容。 此共享协定允许在用户调用“共享”时将你的应用显示为选项之一。

注释

本文中的代码示例来自 UWP 应用。 桌面应用应使用 IDataTransferManagerInterop。 有关详细信息和代码示例,请参阅 显示依赖于 CoreWindow 的 WinRT UI 对象

还可以参考 Windows 应用中的 WPF 共享内容源应用示例集成共享选项 ,了解有关在桌面应用中共享数据的其他信息。

将应用声明为共享目标

当用户调用“共享”时,系统会显示可能的目标应用的列表。 为了显示在列表中,你的应用需要声明它支持“共享”合约。 这让系统知道你的应用可用于接收内容。

  1. 打开清单文件。 它应该被称为类似于 package.appxmanifest的东西。
  2. 打开 声明 选项卡。
  3. 可用声明 列表中选择 共享目标,然后选择 添加

选择文件类型和格式

接下来,确定支持的文件类型和数据格式。 共享 API 支持多种标准格式,例如文本、HTML 和位图。 还可以指定自定义文件类型和数据格式。 如果这样做,请记住源应用必须知道这些类型和格式是什么:否则,这些应用无法使用格式共享数据。

仅注册您的应用可以处理的格式。 当用户调用“共享”时,仅显示支持共享数据的目标应用。

设置文件类型:

  1. 打开清单文件。 它应该被称为类似于 package.appxmanifest的东西。
  2. 声明 页的 支持的文件类型 部分,选择 新增
  3. 键入要支持的文件扩展名,例如“.docx”。需要包括时间段。 如果要支持所有文件类型,请选中 SupportsAnyFileType 复选框。

设置数据格式:

  1. 打开清单文件。
  2. 打开 数据格式 部分的 声明 页,然后选择 新增
  3. 键入支持的数据格式的名称,例如“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

当用户选择你的应用来接收内容时,我们建议你创建 QuickLinkQuickLink 就像一个快捷方式,让用户更容易与你的应用共享信息。 例如,可以创建一个 QuickLink,以打开一封已经预先填写了好友电子邮件地址的新邮件。

QuickLink 必须具有标题、图标和 ID。当用户点击“共享魅力”按钮时,将显示标题(如“电子邮件妈妈”)和图标。 应用使用 ID 来访问任何自定义信息,例如电子邮件地址或登录凭据。 当应用创建 QuickLink时,应用将通过调用 ReportCompletedQuickLink 返回到系统。

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);
}

另请参阅