Windows Phoneアプリケーション開発入門

第39回 Pictures HubとMusic + Videos Hubにアプリケーションを統合してみよう!(2)

この記事を読むのに必要な時間:およそ 5 分

Pictures Hubから任意の写真をパラメータとして渡して共有する

ユーザーは,Pictures Hubから写真を共有したいサービスやアプリケーションを選択することが可能です。この共有アプリケーション一覧に開発中のアプリケーションも表示させることができます。

まずはWMAppManifest.xmlを編集する必要があります。ソリューションエクスプローラーにてPropertiesフォルダを開きます。

画像

一番下にあるWMAppManifest.xmlを開きましょう。以下のようにApp要素の子要素として,以下のExtensions要素を追加します。ExtensionNameやConsumerIDの値は固定値ですので変更しないでください。

<Extensions>
      <Extension ExtensionName="Photos_Extra_Share" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
</Extensions>

端末へのデプロイ後にPictures Hubで任意の写真を選択し,⁠共有...」を選択しました。PictureHubWP71Testというテストアプリが一覧に追加されているのが確認できます。

画像

自アプリケーション側でパラメータを受け取る

Pictures Hubの「共有...」からアプリケーションを選択した場合,クエリ文字列に「FileId」というトークンが付与されます。このトークンから写真情報を取得することが可能です。

// トークンを取り出す
var token = NavigationContext.QueryString["FileId"];

// トークンから写真情報を取得
MediaLibrary library = new MediaLibrary();
Picture picture = library.GetPictureFromToken(token);

実際のアプリケーション内で使用する場合は以下のような実装になるかと思います。

MainPageページへの遷移後にOnNavigatedToメソッドが呼び出されるので,⁠FileId」というキーが存在確認を行い,キーが存在していればMediaLibrary.GetPictureFromTokenメソッドを使用しPictureオブジェクトを取り出だして,Imageコントロールへ設定します。

using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework.Media;

namespace PicturesHubWP70Test2 {
    public partial class MainPage : PhoneApplicationPage {
        public MainPage() {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e) {
            // クエリ文字列を取得
            var queryStrings = NavigationContext.QueryString;

            // Pictures Hubで選択した場合「FileId」というキーが付与されます。
            // FileIdが存在しなければ処理を行いません。
            if (queryStrings.ContainsKey("FileId")) {

                // XNAFramworkを使用してトークンから写真を取得
                MediaLibrary library = new MediaLibrary();
                Picture picture = library.GetPictureFromToken(queryStrings["FileId"]);

                // BitmapImageオブジェクトを作成
                BitmapImage bitmap = new BitmapImage();
                bitmap.CreateOptions = BitmapCreateOptions.None;
                bitmap.SetSource(picture.GetImage());

                // Imageコントロールに画像をBitmapImageオブジェクトを設定
                image.Source = bitmap;
            }
        }
    }
}

Microsoft.Xna.Framework.Media名前空間のMediaLibraryクラスを使用していますので,ソリューションエ クスプローラーから[参照の追加]を選択して,⁠Microsoft.Xna.Framework」を追加しておくのを忘れないでください。

Windows Phone OS 7.0で写真の共有を行う

Windows Phone OS 7.0向けにPictures Hubからの「share...」⁠OS 7.1以降の「共有...」に相当)に対応するのは,特殊な名前のxmlファイルを追加するだけで対応が可能です。

ソリューションエクスプローラーから該当のプロジェクトを作成し,⁠追加⁠⁠→⁠新しい項目]を選択します。

画像

いくつか種類ごとに並んでいますので,XMLファイルを選択して「E0F0E49A-3EB1-4970-B780-45DA41EC7C28.xml 」というファイルを追加します。中身は空で大丈夫です。

画像

以上で「Extras...」よりも簡単ですが対応は完了です。

自アプリケーション側でパラメータを受け取る場合は,Windows Phone OS 7.1の場合と同様に「FileId」というキーが存在しているかどうか確認を行うとよいでしょう。

さいごに

今回はPictures Hubのアプリケーション統合に挑戦しました。

もし現在,写真編集や共有系のアプリを開発される方がいらっしゃるのであれば,少しコードを追加するだけでハブに統合できます。

Pictures Hubを終了させずに,画像閲覧中から特定のアプリケーションに遷移出来るのは便利だと感じて頂けたのではないでしょうか。

今回は以上で終わりです。ありがとうございました。

著者プロフィール

和田健司(わだけんじ)

1982年10月12日生まれ。大阪で働くプログラマ。Microsoft MVP for Device Application Development(Jul 2010 - Jun 2011)。Windows Mobileに傾倒し今に至る。Windows Mobile向けのTipsを書いています。iPhoneアプリ開発を始めました。嫌いな食べ物はカレー。

URL: http://ch3cooh.jp/
Blog: http://d.hatena.ne.jp/ch3cooh393/