KatsuYuzuのブログ

.NET の開発をメインとした日記です。

ストアアプリで自分のアプリへデータを共有する #win8dev_jp #wpdev_jp

f:id:KatsuYuzu:20140807003450j:plain
これまで、共有の呼び出し、他のアプリへ共有するデータの引き渡しを紹介しました。

今回は他のアプリが共有したデータを自分のアプリで受け取ります。

データの共有を受け取る

共有の受信では、あらかじめ受信できるデータを宣言する必要があります。宣言はマニフェストで行い、宣言をした時点で共有ターゲットのアプリ一覧に表示されます。適切に処理する形式のみ宣言しましょう。

  1. ユニバーサルアプリプロジェクトを準備
  2. マニフェストで共有ターゲットの宣言
  3. App.xaml.csでOnShareTargetActivatedによるアプリの起動を処理
  4. ShareOperationからデータを受信する

ユニバーサルアプリプロジェクトを準備

プロジェクトを作成します。前回と同じものに受信用のページを追加しました。
f:id:KatsuYuzu:20140730234130p:plain:w400
f:id:KatsuYuzu:20140730234433p:plain:h300
f:id:KatsuYuzu:20140807005454p:plain:w400
f:id:KatsuYuzu:20140807031011p:plain:h100

<StackPanel>
    <TextBlock x:Name="receivedDataTitle"></TextBlock>
    <TextBlock x:Name="receivedDataDescription"></TextBlock>
    <Image x:Name="receivedDataImage"></Image>
</StackPanel>

マニフェストで共有ターゲットの宣言

Package.appxmanifestのGUIで[宣言]を開き[使用可能な宣言]の中から[共有ターゲット]を選び、追加します。
f:id:KatsuYuzu:20140807010253p:plain:w400
f:id:KatsuYuzu:20140807010324p:plain
次に受信のための説明を[プロパティ]の[説明の共有]で指定します。説明はWindows Phoneでは表示されません。
f:id:KatsuYuzu:20140807031038p:plain
f:id:KatsuYuzu:20140807031049p:plain
最後にどんなデータを受信できるかを追加して、詳細を指定します。
f:id:KatsuYuzu:20140807011332p:plain

App.xaml.csでOnShareTargetActivatedによるアプリの起動を処理

OnShareTargetActivatedでアプリが起動されます。OnLaunchedと同様にフレームの生成やコンテンツの割り当てを行います。
今回は通常起動時はメインページ、共有起動時は専用のページへ遷移というようにしました。また、遷移後のページで共有データを処理できるようにNavigateに引き渡しています。

protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
    var rootFrame = new Frame();
    rootFrame.Navigate(typeof(ReceivedPage), args.ShareOperation);
    Window.Current.Content = rootFrame;
    Window.Current.Activate();
}

同一ページで表現する場合はスナップの画面サイズへの対応をしておくと良いでしょう。

ShareOperationからデータを受信する

遷移後のページではOnNavigatedToで共有データの受信を行います。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var shareOperation = e.Parameter as ShareOperation;
    if (shareOperation == null)
    {
        return;
    }

    this.receivedDataTitle.Text = shareOperation.Data.Properties.Title;
    this.receivedDataDescription.Text = shareOperation.Data.Properties.Description;
}

タイトルなどの通常のプロパティは普通に参照できますが、共有データはContainsで確かめてから取得する必要があります。

// StorageItems の共有の確認
if (shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
    // 共有されたアイテムの取得
    IReadOnlyList<IStorageItem> storageItems= await shareOperation.Data.GetStorageItemsAsync();

    // ファイルの抽出
    var file = storageItems
        .OfType<StorageFile>()
        .First();

    // 画像の読み込み
    using (var stream = await file.OpenReadAsync())
    {
        var bitmapImage = new BitmapImage();
        bitmapImage.SetSource(stream);
        this.receivedDataImage.Source = bitmapImage;
    }
}

確かめずに取得して、存在しなかった場合は例外が発生するので気を付けてください。
f:id:KatsuYuzu:20140807014559p:plain

サンプル

記事で紹介した共有の呼び出し、送信、受信を含んだサンプルをGitHubに置きました。
KatsuYuzu/universal-Windows-apps-Sample · GitHub
Windows ストアアプリではサンプル自身からサンプル自身へ共有して動作確認ができます。Windows Phoneアプリでは自身がアプリ一覧に表示されないので他のアプリから共有を呼び出してください。フォトで写真を共有するのが手頃かと思います。

Windows ストアアプリ

f:id:KatsuYuzu:20140807015935j:plain

Windows Phoneアプリ

f:id:KatsuYuzu:20140807024401j:plain:h300
f:id:KatsuYuzu:20140807024423j:plain:h300