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...については、気づいた頃に登録されていました。タイミングがよくわからないですが。