Windows Phone 7のハブ統合を試す (1) pictures Hub

Windows Phone 7 の特徴的な考え方として、「扱うデータを基本に考えて、ハブでまとめて表示する」というものがありました。しかしまだAPIが整備しきれていないのか、扱えるものは少ないのが現状です。

今現状さわることができるものとして、pictures Hub と Music+Videos Hub がありますので、この2つの Hub と自分のアプリを連携させる方法をご紹介します。

pictures Hub と連携できるもの

pictures Hub との連携では「選択された写真を自分のアプリへ渡すこと」ができます。写真選択後、アプリケーションバーのメニューから選べる share... と extras... から表示されるメニューに自分のアプリを表示できます。

この2つは表示のされ方が異なるだけで同じ動作をするのですが、share は特定のサービスへのアップロード、extra は写真そのものにエフェクトをかけて編集するなどの用途が想定されているものだと思います。

方法

shareに表示するのもextraに表示するのも基本は一緒で、「XMLファイルをプロジェクトに追加」して「MainPageのOnNavigatedToで引数を受け取って、MediaLibraryから取得する」だけです。

まず、新規にプロジェクトを作成したら、参照設定で「Microsoft.Xna.Framework」を追加します。

次に、動作確認用に MainPage.xml の ContentPanel の Grid に Image を追加します。

<Image Height="350" HorizontalAlignment="Left" Margin="5,5,0,0" Name="retrievePic" Stretch="Fill" VerticalAlignment="Top" Width="450" />

share に追加する

share にアプリを追加するには、「E0F0E49A-3EB1-4970-B780-45DA41EC7C28.xml」というファイル名の空のXMLファイルをプロジェクトに追加します。*1

次に、MainPage.cs のOnNavigateToをオーバーライドして以下のように記述します。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // share から起動した場合は FileId を持っています
    if (this.NavigationContext.QueryString.ContainsKey("FileId"))
    {
        // MediaLibrary から引数の写真を取得
        MediaLibrary library = new MediaLibrary();
        Picture picture = library.GetPictureFromToken(this.NavigationContext.QueryString["FileId"]);

        // ビットマップを取得して Image にセット
        BitmapImage bitmap = new BitmapImage();
        bitmap.SetSource(picture.GetImage());
        WriteableBitmap picLibraryImage = new WriteableBitmap(bitmap);
        retrievePic.Source = picLibraryImage;
    }
}

実機に転送し、一度アプリを終了させて picture Hub で任意の写真を選択、share... を選択すると自分のアプリが「upload to [アプリ名]」と表示され、選択するとアプリ内で画像が表示されます。

extras に追加する

extras に追加するには、Extras.xml をプロジェクトに追加して、以下のとおり記述します。

<?xml version="1.0" encoding="utf-8" ?>
<Extras>
  <PhotosExtrasApplication>
    <Enabled>true</Enabled>
  </PhotosExtrasApplication>
</Extras>

そして、MainPage.cs のOnNavigateToをオーバーライドして以下のように記述します。

お気づきでしょうが、引数が異なるだけで仕組みは全く一緒です。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // extras から起動した場合は token を持っています
    if (this.NavigationContext.QueryString.ContainsKey("token"))
    {
        // MediaLibrary から引数の写真を取得
        MediaLibrary library = new MediaLibrary();
        Picture picture = library.GetPictureFromToken(this.NavigationContext.QueryString["token"]);


        // ビットマップを取得して Image にセット
        BitmapImage bitmap = new BitmapImage();
        bitmap.SetSource(picture.GetImage());
        WriteableBitmap picLibraryImage = new WriteableBitmap(bitmap);
        retrievePic.Source = picLibraryImage;
    }
}

これで転送すると、extras メニューが増え、自分のアプリ名とアイコンが表示されます。

感想

これで、Androidで写真を選んだときの「共有」メニューの動作をWP7でも実装することができます。

ただ、機能はほぼ同じなのにXMLが異なっていて、一貫性がないのでなんとかしてほしいなあ。と思いました。特に share の方のファイル名 GUID は不親切です...

次回は Music + Videos Hub について書きます。こっちのほうがなんかいろいろできそうで楽しそうです。

*1:なんでこんな面倒な作りになっているんだろう...