この記事では、デスクトップまたはユニバーサル Windows プラットフォーム (UWP) アプリで共有コントラクトをサポートする方法について説明します。 共有コントラクトは、テキスト、リンク、写真、ビデオなどのデータをすばやくアプリ間で簡単に共有する方法です。 たとえば、ユーザーがソーシャル ネットワーキング アプリを使用して友人と Web ページを共有したり、後で参照するリンクをノート アプリに保存したりできます。
注
この記事のコード例は、UWP アプリのコード例です。 デスクトップ アプリでは 、IDataTransferManagerInterop を使用する必要があります。 詳細とコード例については、「 CoreWindow に依存する WinRT UI オブジェクトの表示」を参照してください。
デスクトップ アプリでのデータ共有の詳細については、 WPF 共有コンテンツ ソース アプリのサンプル と Windows アプリの [共有の統合] オプション を参照することもできます。
イベント ハンドラーを設定する
ユーザーが共有を呼び出すたびに呼び出される DataRequested イベント ハンドラーを追加します。 これは、ユーザーがアプリ内のコントロール (ボタンやアプリ バー コマンドなど) をタップしたとき、または特定のシナリオ (ユーザーがレベルを終了して高いスコアを取得した場合など) に自動的に発生する可能性があります。
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;
DataRequested イベントが発生すると、アプリは DataRequest オブジェクトを受け取ります。 これには、ユーザーが共有するコンテンツを提供するために使用できる DataPackage が含まれています。 共有するタイトルとデータを指定する必要があります。 説明は省略可能ですが、推奨されます。
DataRequest request = args.Request;
データの選択
次のようなさまざまな種類のデータを共有できます。
- プレーンテキスト
- ユニフォームリソース識別子 (URI)
- HTML
- 書式設定されたテキスト
- ビットマップ
- Files
- 開発者が定義したカスタム データ
DataPackage オブジェクトには、これらの形式の 1 つ以上を任意の組み合わせで含めることができます。 次の例では、テキストの共有を示します。
request.Data.SetText("Hello world!");
プロパティの設定
共有用にデータをパッケージ化する場合は、共有するコンテンツに関する追加情報を提供するさまざまなプロパティを指定できます。 これらのプロパティは、ターゲット アプリがユーザー エクスペリエンスを向上させるのに役立ちます。 たとえば、説明は、ユーザーが複数のアプリとコンテンツを共有している場合に役立ちます。 画像または Web ページへのリンクを共有するときにサムネイルを追加すると、ユーザーへの視覚的な参照が提供されます。 詳細については、「 DataPackagePropertySet」を参照してください。
Warnung
タイトルを除くすべてのプロパティは省略可能です。 "title" プロパティは必須設定であり、設定する必要があります。
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();
}
}