データの共有
この記事では、デスクトップまたはユニバーサル Windows プラットフォーム (UWP) アプリで共有コントラクトをサポートする方法について説明します。 共有コントラクトは、アプリ間でデータ (テキスト、リンク、写真、ビデオなど) をすばやく共有するための簡単な方法です。 たとえば、ユーザーがソーシャル ネットワーキング アプリを使って友人と Web ページを共有する場合や、後で参照するためにリンクをメモ帳アプリで保存する場合があります。
注意
この記事のコード例は、UWP アプリからのものです。 デスクトップアプリでは、 Idatatransの Managerinteropを使用する必要があります。 詳細とコード例については、「 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();
}
}