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

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

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

はじめに

前回は,Windows Phone OS 7.1向けに,Music + Videos HubとPictures Hubのトップ画面からアプリケーションを起動する方法についてご紹介しました。

今回は,Pictures Hubで任意の1枚の写真を「すばやく画像処理したい場合」または「共有したい場合」など,Pictures Hubから写真情報をパラメータとして渡し,任意のアプリケーションを起動する方法をご紹介したいと思います。

画像

Windows Phone OS 7.0とOS 7.1とでは手順が異なりますので,どちらのSDKを使うかによって使い分けて頂ければと思います。まずは,Windows Phone OS 7.1での写真の共有とアプリ起動の方法についてご紹介いたしまして,次にそれぞれのWindows Phone OS 7.0での実装についてご紹介します。

Pictures Hubから任意の写真をパラメータとして渡してアプリケーションを起動する

Pictures Hubにて選択した写真をすばやく画像処理したい場合,わざわざPictures Hubを終了させずにアプリケーションを起動する方法が提供されています。

WMAppManifest.xmlを編集します。ソリューションエクスプローラー開き,Propertiesフォルダを開きます。

画像

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

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

どこに追加して良いのか判らない方がいるかもしれません。MAppManifest.xmlを全文表示します。

<?xml version="1.0" encoding="utf-8"?>
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersion="7.1">
  <App xmlns="" ProductID="{25000fe8-f99e-454a-a115-a48a0eb15606}" 
       Title="PictureHubWP71Test" RuntimeType="Silverlight" 
       Version="1.0.0.0" Genre="apps.normal"  
       Author="author" Description="" Publisher="PictureHubWP71Test">
    <IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPath>
    <Capabilities>
      <Capability Name="ID_CAP_GAMERSERVICES"/>
      <Capability Name="ID_CAP_IDENTITY_DEVICE"/>
      <Capability Name="ID_CAP_IDENTITY_USER"/>
      <Capability Name="ID_CAP_LOCATION"/>
      <Capability Name="ID_CAP_MEDIALIB"/>
      <Capability Name="ID_CAP_MICROPHONE"/>
      <Capability Name="ID_CAP_NETWORKING"/>
      <Capability Name="ID_CAP_PHONEDIALER"/>
      <Capability Name="ID_CAP_PUSH_NOTIFICATION"/>
      <Capability Name="ID_CAP_SENSORS"/>
      <Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/>
      <Capability Name="ID_CAP_ISV_CAMERA"/>
      <Capability Name="ID_CAP_CONTACTS"/>
      <Capability Name="ID_CAP_APPOINTMENTS"/>
    </Capabilities>
    <Tasks>
      <DefaultTask  Name ="_default" NavigationPage="MainPage.xaml"/>
    </Tasks>
    <Tokens>
      <PrimaryToken TokenID="PictureHubWP71TestToken" TaskName="_default">
        <TemplateType5>
          <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI>
          <Count>0</Count>
          <Title>PictureHubWP71Test</Title>
        </TemplateType5>
      </PrimaryToken>
    </Tokens>
    <Extensions>
      <Extension ExtensionName="Photos_Extra_Viewer" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
    </Extensions>
  </App>
</Deployment>

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

画像

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

Pictures Hubの「アプリ...」からアプリケーションを選択させると,クエリ文字列に「token」というトークンが付与されます。このトークンから写真情報を取得することが可能です。簡単なサンプルコードは以下の通りです。

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

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

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

MainPageページへの遷移後にOnNavigatedToメソッドが呼び出されるので,⁠token」というキーが存在確認を行い,キーが存在していれば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で選択した場合「token」というキーが付与されます。
            // tokenが存在しなければ処理を行いません。
            if (queryStrings.ContainsKey("token")) {

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

                // 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からの「extras...」⁠OS 7.1以降の「アプリ...」に相当)に対応するには,⁠Extras.xml」という特殊な名前のスクリプトファイルを追加する必要があります。

ソリューションエクスプローラーから該当のプロジェクトを作成し,⁠追加]⁠⁠新しい項目]を選択します。インストールされたテンプレートから「XML ファイル」を選択します。ファイル名は必ず「Extras.xml」としてください。

画像

「share...」の場合と異なり,Extras.xmlは中身が空では正しく動作しません。エディタ等にてExtras.xmlを開いて頂きまして,以下のxmlをコピーしてください(xmlの中身は下記通りである必要があります)⁠

画像

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

端末へこのアプリケーションをデプロイした状態で,Pictures Hubで任意の写真を見ている時にアプリケーションメニューの「extras...」をタップすると,自アプリケーションが追加されていることが確認できます。

以上で,extrasの一覧に表示させるための準備は完了です。あとは自アプリケーション側でパラメータを受け取る場合,Windows Phone OS 7.1の場合と同様に「token」というキーが存在しているかどうか確認を行うとよいでしょう。

著者プロフィール

和田健司(わだけんじ)

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/

コメント

コメントの記入