古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Windows Phone "Mango" におけるハブインテグレーション Pictures Hub編

Windows Phone 7.0の頃は、id:iseebiさんが記した Windows Phone 7のハブ統合を試す (1) pictures Hub - backyard of 伊勢的新常識 が使えましたが、Mangoでは使えなくなってしまったようです。
Mangoでどうやって利用するかについて簡単にまとめてみます。

ちなみに、今回紹介する内容は全てベータ版プレビューのMangoを使用しています。今後の開発状況によっては大きく変わる場合がありますので、現段階では参考程度によろしくお願いします。


ハブインテグレーションは、Pictures HubやMusic+Videos Hubと自分で作ったアプリケーションとを連携させる仕組みで、撮った写真をアプリケーションに転送したり、再生中の曲を取得したりなど様々な用途に利用できるものです。
Pictures Hubでは主に、写真を選択した時のアプリケーションバー(下部にある「...」)にある「share...」や「applications...」にアプリケーションの情報を追加して、写真を転送するように設定します。

下ごしらえ

ターゲットバージョンを「Windows Phone 7.1」にしてプロジェクトを作成したら、動作確認をするために Image コントロールを追加しましょう。「x:Name="LayoutRoot"」の属性がついた Grid コントロールの中の、「x:Name="ContentPanel"」属性がついた Grid コントロールに以下のように記述します。

<Image x:Name="pictureImage" Height="607" VerticalAlignment="Top" HorizontalAlignment="Left" Width="456" />

あとは、参照設定に「Microsoft.Xna.Framework.dll」を追加しておきます。

applications (extras)に追加する

「ソリューション エクスプローラー」から、プロジェクト名の真下にある [Properties] のツリーを展開すると、「WMAppManifest.xml」というファイルがあります。これを開きます。

開いたファイルの33, 34行目、「」と「」の間を空けて、以下のコードを追加します。

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

内容は変更せずそのままコピペして下さい。

「MainPage.xaml.cs」を開き、以下のコードを追加します。

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
	// applicationsからの転送は「token」というクエリを持って送られてくる
	if (this.NavigationContext.QueryString.ContainsKey("token"))
	{
		// MediaLibraryを使ってクエリの情報から画像を取得
		var library = new Microsoft.Xna.Framework.Media.MediaLibrary();
		var pict = library.GetPictureFromToken(this.NavigationContext.QueryString["token"]);

		// BitmapImageに取り込みImageコントロールにセットする
		var image = new System.Windows.Media.Imaging.BitmapImage();
		image.SetSource(pict.GetImage());
		this.pictureImage.Source = image;
	}
}


デバッグ実行してすぐ終了して、Pictures Hubを起動…といいたいところですが、Windows PhoneのエミュレーターではPictures Hubがありません(残念…)
そこで、先日App Hub登録者向けに配布された、ベータ版のMangoを実機に入れられるプログラムで導入した端末でテストします。
Pictures Hubで適当な写真を選択して、アプリケーションバーを展開すると、「applications...」のメニューを選択すると、先ほどビルドして転送したアプリケーションの名前が表示されていると思います。それを選択すると、アプリケーションが開いて、先ほど選択していた画像が表示されます。

shareを使う

基本はapplicationsに追加するときとさほど変わりはありません。
「WMAppManifest.xml」の33, 34行目、「」と「」の間を空けて、以下のコードを追加します。

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

内容は変更せずそのままコピペして下さい。ちなみに、applicationsと同時に追加する場合は、の間に追加する形で「

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
	// shareからの転送は「FileId」というクエリを持って送られてくる
	if (this.NavigationContext.QueryString.ContainsKey("FileId"))
	{
		// MediaLibraryを使ってクエリの情報から画像を取得
		var library = new Microsoft.Xna.Framework.Media.MediaLibrary();
		var pict = library.GetPictureFromToken(this.NavigationContext.QueryString["FileId"]);

		// BitmapImageに取り込みImageコントロールにセットする
		var image = new System.Windows.Media.Imaging.BitmapImage();
		image.SetSource(pict.GetImage());
		this.pictureImage.Source = image;
	}
}

こちらもapplicationsと同時に追加する場合は追記する形で。


これでshare...に追加できる…はずなのですが、こちらはなぜか何度やっても一覧に表示されませんでした。ベータ版故のバグだろうとは思います。もしくは、方法が違うのかもしれません。
誰かこの辺わかる人教えて下さい ;-p

7月14日1時追記
share...については、気づいた頃に登録されていました。タイミングがよくわからないですが。