Windows アプリで共有データを受信する

Windows共有コントラクトを使用すると、アプリをターゲット アプリとしてWindows共有シートに表示できます。これにより、ユーザーは他のアプリのコンテンツを自分のアプリに直接共有できます。 この記事では、アプリが共有ターゲットとしてアクティブ化された後に共有コンテンツを処理する方法について説明します。

ここでの手順に従う前に、アプリを共有ターゲットとして登録します。

Note

WinUI 3 デスクトップ アプリのアクティブ化モデルは、UWP とは異なります。 WinUI 3 では、共有のアクティブ化は、AppInstance.GetActivatedEventArgs()経由ではなく、アプリのスタートアップ コードのApplication.OnShareTargetActivated()を使用して処理されます。 この記事で説明する ShareOperation API と DataPackageView API は、 ShareTargetActivatedEventArgsを取得すると同じように動作します。 Windows アプリ SDKのアクティブ化パターンについては、「パッケージ アプリを Windows Share と統合する」を参照してください。

サポートするデータ形式を選択する

アプリをパッケージ マニフェストで共有ターゲットとして宣言するときは、アプリで受け取ることができるファイルの種類とデータ形式を指定します。 共有する形式をサポートするアプリのみが共有シートに表示されます。

サポートされている型は、次の 2 つの方法で構成できます。

Visual Studio マニフェスト エディターの使用:

  1. Visual Studio で package.appxmanifest を開きます。
  2. [宣言] タブ 選択します。
  3. [使用可能な宣言] ボックスの一覧から [共有ターゲット] を選択し、[追加] を選択します。
  4. [ サポートされているファイルの種類] で、アプリで処理するファイル拡張子 ( .jpg.pngなど) を追加します。 すべてのファイルの種類を受け入れるには、[ SupportsAnyFileType ] を選択します。
  5. [ データ形式] で、アプリで処理する形式名 ( TextUriBitmapなど) を追加します。

マニフェスト XML 内で直接:

<Extensions>
  <uap:Extension Category="windows.shareTarget">
    <uap:ShareTarget>
      <uap:SupportedFileTypes>
        <uap:SupportsAnyFileType />
      </uap:SupportedFileTypes>
      <uap:DataFormat>Text</uap:DataFormat>
      <uap:DataFormat>Uri</uap:DataFormat>
      <uap:DataFormat>Bitmap</uap:DataFormat>
      <uap:DataFormat>StorageItems</uap:DataFormat>
    </uap:ShareTarget>
  </uap:Extension>
</Extensions>

アプリで処理できる形式にのみ登録します。 形式を宣言しても処理できない場合、ユーザー エクスペリエンスは低下します。

共有データの読み取り

アプリが共有ターゲットとしてアクティブ化されると、経由で ShareTargetActivatedEventArgs オブジェクトを受け取ります。 その Data プロパティは、共有コンテンツを公開する DataPackageView です。

Containsを使用して使用可能な形式を確認し、適切な非同期メソッドを呼び出してデータを取得します。

ShareOperation shareOperation = args.ShareOperation;

if (shareOperation.Data.Contains(StandardDataFormats.Text))
{
    string text = await shareOperation.Data.GetTextAsync();
    // Process the shared text.
}

if (shareOperation.Data.Contains(StandardDataFormats.WebLink))
{
    Uri webLink = await shareOperation.Data.GetWebLinkAsync();
    // Process the shared link.
}

if (shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
    IReadOnlyList<IStorageItem> items = await shareOperation.Data.GetStorageItemsAsync();
    // Process the shared files or folders.
}

レポート共有の状態

共有データの処理に時間がかかる場合 (サーバーへのファイルのアップロードなど)、 ShareOperation 状態メソッドを使用してシステムに進行状況を報告します。 これにより、システムはソース アプリのライフサイクルを適切に管理できます。

共有操作の進行に合わせて、次のメソッドを順番に呼び出します。

Method 呼び出すタイミング
ReportStarted アプリが共有の処理を開始するとすぐに。 この時点以降は、ユーザーによる共有 UI の操作は想定しないでください。
ReportDataRetrieved アプリが必要なすべてのデータを DataPackageViewから取得した後。 これにより、システムはソース アプリを中断または終了できます。
ReportSubmittedBackgroundTask 共有 UI が閉じられた後、アプリがバックグラウンドで処理を続行する場合。
ReportCompleted アプリが共有コンテンツの処理を正常に完了したとき。
ReportError 重大なエラーが発生した場合。 ユーザーにメッセージが表示され、共有操作が終了します。
shareOperation.ReportStarted();

try
{
    string text = await shareOperation.Data.GetTextAsync();
    shareOperation.ReportDataRetrieved();

    // Perform any additional processing here...
    await ProcessSharedDataAsync(text);

    shareOperation.ReportCompleted();
}
catch (Exception)
{
    shareOperation.ReportError("Something went wrong. Please try again.");
}

Note

共有操作を終了する必要があるほど重大なエラーが発生した場合にのみ、ReportError を呼び出してください。 回復可能なエラーの場合は、 ReportErrorを呼び出さずに処理を続行できます。

Note

ターゲット アプリがReportDataRetrievedする前にReportStartedを呼び出すことができる場合があります。たとえば、アプリがアクティブ化処理の一環としてデータを取得し、ユーザーが明示的に ReportStarted] ボタンを選択したときにのみを呼び出す場合などです。

ユーザーがコンテンツをアプリに共有すると、 QuickLink を返して、将来の共有を高速化できます。 QuickLinkは、共有シートのショートカットとして表示されます。たとえば、ユーザーがアプリの UI を移動することなく、その連絡先とすばやく共有できる連絡先ショートカットなどです。

QuickLinkには、タイトル、アイコン、ID があります。 ID は、ショートカットのアプリの内部識別子 (連絡先 ID やアカウント名など) です。 ユーザーが後で QuickLinkを選択すると、システムによってアプリがアクティブ化され、 QuickLink ID が ShareOperation.QuickLinkId 経由で返されます。

QuickLink に渡してを返します。

private async Task ReportCompletedWithQuickLink(
    ShareOperation shareOperation, string quickLinkId, string quickLinkTitle)
{
    QuickLink quickLinkInfo = new QuickLink
    {
        Id = quickLinkId,
        Title = quickLinkTitle,

        // QuickLink supported types are configured independently from the manifest.
        SupportedFileTypes = { "*" },
        SupportedDataFormats =
        {
            StandardDataFormats.Text,
            StandardDataFormats.WebLink,
            StandardDataFormats.Bitmap,
            StandardDataFormats.StorageItems
        }
    };

    StorageFile iconFile = await Windows.ApplicationModel.Package.Current
        .InstalledLocation.CreateFileAsync(
            "assets\\contact.png", CreationCollisionOption.OpenIfExists);
    quickLinkInfo.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile);

    shareOperation.ReportCompleted(quickLinkInfo);
}

Note

QuickLinkには、関連付けられているデータではなく、ID のみが格納されます。 アプリは、ユーザー データ (連絡先の詳細など) を保持し、 QuickLinkShareOperation.QuickLinkIdを介してアクティブ化されたときにそれを取得する責任を負います。

こちらも参照ください