データの共有

この記事では、デスクトップやユニバーサル Windows プラットフォーム (UWP) アプリで、共有コントラクトをサポートする方法について説明します。 共有コントラクトは、テキスト、リンク、写真、ビデオなどのデータをアプリ間ですばやく共有するための簡単な方法です。 たとえば、ユーザーがソーシャル ネットワーキング アプリを使って友だちと Web ページを共有する場合や、後で参照するためにリンクをメモ帳アプリで保存する場合があります。

Note

この記事のコード例は、UWP アプリのものです。 デスクトップ アプリでは、IDataTransferManagerInterop を使用する必要があります。 詳細な情報とコード例については、「CoreWindow に依存する WinRT UI オブジェクトを表示する」をご覧ください。 「WPF 共有コンテンツ ソース アプリのサンプル」も併せてご覧ください。

イベント ハンドラーの設定

ユーザーが共有を呼び出すたびに呼び出される DataRequested イベント ハンドラーを追加します。 これは、ユーザーがアプリ内のコントロール (ボタンやアプリ バー コマンドなど) をタップしたとき、または特定のシナリオ (ユーザーがレベルを終了して高いスコアを取得した場合など) に自動的に発生する可能性があります。

DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;

DataRequested イベントが発生すると、アプリは DataRequest オブジェクトを受け取ります。 これには、ユーザーが共有するコンテンツを提供するために使用できる DataPackage が含まれています。 共有するタイトルとデータを指定する必要があります。 説明は任意ですが、指定することをお勧めします。

DataRequest request = args.Request;

データを選択します

次のようなさまざまな種類のデータを共有できます。

  • プレーンテキスト ファイル
  • Uniform Resource Identifier (URI)
  • HTML
  • 書式付きテキスト
  • ビットマップ
  • ファイル
  • 開発者が定義したカスタム データ

DataPackage オブジェクトには、これらの形式の 1 つ以上を任意の組み合わせで含めることができます。 次の例は、テキストの共有を示しています。

request.Data.SetText("Hello world!");

プロパティの設定

共有用にデータをパッケージ化する場合は、共有するコンテンツに関する追加情報を提供するさまざまなプロパティを指定できます。 これらのプロパティは、ターゲット アプリのユーザー エクスペリエンスを向上させるのに役立ちます。 たとえば、説明は、ユーザーが複数のアプリとコンテンツを共有している場合に役立ちます。 画像または Web ページへのリンクを共有するときにサムネイルを追加すると、ユーザーに視覚的な参照が提供されます。 詳細については、「DataPackagePropertySet」をご覧ください。

警告

タイトルを除くすべてのプロパティは任意です。 タイトル プロパティは必須で、必ず設定する必要があります。

request.Data.Properties.Title = "Share Example";
request.Data.Properties.Description = "A demonstration on how to share";

共有 UI を起動する

共有用の UI は、システムによって提供されます。 これを起動するには、ShowShareUI メソッドを呼び出します。

DataTransferManager.ShowShareUI();

エラーの処理

ほとんどの場合、コンテンツの共有は簡単なプロセスです。 ただし、予期しない事態が発生する可能性は常にあります。 たとえば、アプリで、共有するコンテンツをユーザーが選択する必要があったのに何も選択しなかった場合などです。 このような状況を処理するには、FailWithDisplayText メソッドを使用します。このメソッドは、問題が発生した場合にユーザーにメッセージを表示します。

デリゲートとの共有の遅延

場合によっては、ユーザーがすぐに共有したいデータを準備しても意味がない場合があります。 たとえば、複数の異なる形式の大きな画像ファイルの送信がアプリでサポートされている場合、ユーザーが選択を行う前にすべての画像を作成するのは効率的ではありません。

この問題を解決するために、DataPackage にはデリゲート (受信アプリがデータを要求したときに呼び出される関数) を含めることができます。 ユーザーが共有するデータがリソースを大量に消費する場合は、いつでもデリゲートを使用することをお勧めします。

async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
    // Provide updated bitmap data using delayed rendering
    if (this.imageStream != null)
    {
        DataProviderDeferral deferral = request.GetDeferral();
        InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();

        // Decode the image.
        BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);

        // Re-encode the image at 50% width and height.
        BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
        imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
        imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
        await imageEncoder.FlushAsync();

        request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
        deferral.Complete();
    }
}

関連項目