Hatena::ブログ(Diary)

backyard of 伊勢的新常識 RSSフィード Twitter

[収集中]日本の開発者が作ったWindows Phone 7アプリ一覧

2011/01/13(Thu)

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

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

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

pictures Hub連携できるもの

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

f:id:iseebi:20110113224133j:image

この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 [アプリ名]」と表示され、選択するとアプリ内で画像が表示されます

f:id:iseebi:20110113224134j:image

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 メニューが増え、自分アプリ名とアイコンが表示されます

f:id:iseebi:20110113224135j:image


感想

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

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

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

出典

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

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。