エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 のファイルおよび URI の関連付けを使用してアプリを自動起動する

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

Windows Phone 8 のファイルと URI の関連付けを使用すると、別のアプリで特定のファイルの種類または URI スキームを起動したときに自分のアプリを自動的に起動できます。アプリの起動時に、ディープ リンク URI を使用して、ファイル (ファイルへの参照) または URI をアプリに送信します。また、関連起動 API を使用して同じ方法で別のアプリを起動することもできます。ここでは、ファイルおよび URI の関連付け、およびそれらをアプリで使用する方法について説明します。

ヒントヒント:

Windows 8 と同様に、Windows Phone 8 では LaunchFileAsync を使用してファイルを起動し、LaunchUriAsync を使用して URI を起動します。ただし、Windows Phone XAML アプリでファイルまたは URI を受け取る方法は異なります。また、Windows Phone には "既定" の ストア アプリがありません。特定のファイルまたは URI の関連付けを処理できる複数の ストア アプリがインストールされている場合、ユーザーはメニューから受信アプリを選択します。

このトピックは、次のセクションで構成されています。

ユーザーが特定のファイルを開く必要がある場合、ファイルの関連付けにより、アプリを自動的に起動できます。ファイルは、以下などのさまざまなソースである可能性がありますが、以下に限定されるものではありません。

  • 電子メール添付ファイル

  • Internet Explorer 経由の Web サイト

  • 近距離無線通信 (NFC) タグ

  • ストア の別のアプリ

また、ファイルの関連付けを使用すると、アプリが外部ストレージ API を使用して SD カードから読み取ることができるファイルの種類を確認することもできます。これらの API の詳細については、「Windows Phone 8 のデータ」を参照してください。

ファイルの関連付けの登録

特定のファイルの種類を処理するには、アプリ マニフェスト ファイルでファイルの関連付けを登録します。アプリでは、アプリが処理できるファイルの関連付けを指定できます。ただし、組み込みアプリにより予約されているファイルの関連付けは無視されます。詳細については、「Windows Phone 8 の予約済みのファイルと URI の関連付け」を参照してください。

メモメモ:

Internet Explorer がファイルの関連付けをオーバーライドする場合があります。たとえば、IE は、組み込みのメディア プレーヤーを起動して音楽ファイルとビデオ ファイルを処理します。具体的には、コンテンツの種類が audio/ または video/ の全ファイルです。たとえば、アプリは電子メールの添付ファイルから起動された (予約されていない) 音楽ファイルとビデオ ファイルを処理することができます。ただし、同じファイルが Internet Explorer から起動された場合には、組み込みのメディア プレーヤーがファイルを処理します。

組み込みアプリに表示されるカスタムのファイルの種類の外観を統合させるために、ファイルの隣に表示するロゴ (イメージ ファイル) を指定するオプションがあります。たとえば、(カスタムの種類の) ファイルが電子メール メッセージに添付されていた場合、添付ファイルのダウンロード後、添付ファイルの隣に小さなロゴが表示されます。

ファイルの種類のロゴは白の背景で表示されます。アプリをテストする際、電話でのロゴの表示を必ず確認してください。また、同じファイルの種類に複数のアプリが登録されている場合、ロゴは表示されないので注意してください。その場合、汎用ロゴが使用されます。以下の表に、各ファイルの関連付けに指定できる 3 つのイメージのサイズを示します。

ロゴのサイズ

用途

寸法

電子メール添付ファイル

33 x 33 ピクセル

Medium

Office ハブ リスト ビュー

69 x 69 ピクセル

ブラウザー ダウンロード

176 x 176 ピクセル

ヒントヒント:

ベスト プラクティスとしては、アプリ パッケージの Assets フォルダーにロゴを格納することをお勧めします。

ファイルの関連付けを登録するには、XML (テキスト) エディターを使用して WMAppManifest.xml を編集する必要があります。ソリューション エクスプローラーで、WMAppManifest.xml ファイルを右クリックし、[ファイルを開くアプリケーションの選択] をクリックします。[ファイルを開くアプリケーションの選択] ウィンドウで、[XML (テキスト) エディター] をクリックし、[OK] をクリックします。

アプリ マニフェスト ファイルの Extensions 要素で、FileTypeAssociation 要素を使用してファイルの関連付けを指定します。Extensions 要素は Tokens 要素の直後に置く必要があることに注意してください。以下の例では、2 つの異なるファイル拡張子 ".sdkTest1" と ".sdkTest2" を処理できる、"Windows Phone SDK test file type" という名前の架空のファイルの種類に対するファイルの関連付けを示します。

<Extensions>
   <FileTypeAssociation Name="Windows Phone SDK test file type" TaskID="_default" NavUriFragment="fileToken=%s">
       <Logos>
           <Logo Size="small" IsRelative="true">Assets/sdk-small-33x33.png</Logo>
           <Logo Size="medium" IsRelative="true">Assets/sdk-medium-69x69.png</Logo>
           <Logo Size="large" IsRelative="true">Assets/sdk-large-176x176.png</Logo>
       </Logos>
       <SupportedFileTypes>
         <FileType ContentType="application/sdk">.sdkTest1</FileType>
         <FileType ContentType="application/sdk">.sdkTest2</FileType>

       </SupportedFileTypes>
   </FileTypeAssociation>
</Extensions>

これらの各要素の説明を次の表に示します。

要素

親要素

説明

Extensions

App

Tokens 要素に従う必要があります。

FileTypeAssociation

Extensions

ファイルの関連付けを説明します。最大 20 個のファイルの関連付けを登録できますが、各ファイルの関連付けは一度だけ表示されます。Name 属性が必要ですが、独自のわかりやすい名前を選択できます。示されている TaskID 要素と NavUriFragment 要素を指定します。

Logos

FileTypeAssociation

ファイルの関連付けのすべてのロゴを一覧表示します。ロゴが指定されていない場合、これは省略可能です。

Logo

Logos

省略できます。ファイルの隣に表示するイメージ ファイルを一覧表示します。指定する場合は、すべてのサイズ (小、中、大) を指定する必要があります。IsRelative 属性は true に設定する必要があります。

SupportedFileTypes

FileTypeAssociation

ファイルの種類と関連付けられているすべてのファイル拡張子を一覧表示します。

FileType

SupportedFileTypes

ファイルの種類と関連付けられているファイル拡張子を、ピリオド ('.') を含めて一覧表示します。各ファイル拡張子に最大 20 個のファイル拡張子を関連付けることができますが、各拡張子を使用できるのは一度だけです。アプリで SD カードからファイルを読み取る場合、ファイルの種類を説明するために ContentType 属性も指定する必要があります。

ファイルの起動のリッスン

特定のファイルの種類を処理するためにアプリが起動した場合、ディープ リンク URI を使用してユーザーにアプリが示されます。URI の内部では、FileTypeAssociation 文字列で、URI のソースがファイルの関連付けであり、fileToken パラメーターにファイル トークンが含まれていることを指定します。例として、以下のコードにファイルの関連付けからのディープ リンク URI を示します。


/FileTypeAssociation?fileToken=89819279-4fe0-4531-9f57-d633f0949a19

起動時に、受信したディープ リンク URI を、ファイルを処理できるアプリ ページにマッピングします。複数のファイルの種類を処理する複数のページが存在する場合、カスタム URI マッパーと GetSharedFileName メソッドを使用して、URI をマッピングする前にファイルの種類を確認します。例として、以下のコードに、ディープ リンク URI を解析し、ファイルの種類に応じて異なるページをマッピングする URI マッパーを示します。ファイルの関連付けから起動されなかった場合は、完全な URI 文字列を、変更しない状態で App オブジェクトに戻します。

using System;
using System.IO;
using System.Windows.Navigation;
using Windows.Phone.Storage.SharedAccess;

namespace sdkAutoLaunch
{
    class AssociationUriMapper : UriMapperBase
    {
        private string tempUri;

        public override Uri MapUri(Uri uri)
        {
            tempUri = uri.ToString();

            // File association launch
            if (tempUri.Contains("/FileTypeAssociation"))
            {
                // Get the file ID (after "fileToken=").
                int fileIDIndex = tempUri.IndexOf("fileToken=") + 10;
                string fileID = tempUri.Substring(fileIDIndex);

                // Get the file name.
                string incomingFileName =
                    SharedStorageAccessManager.GetSharedFileName(fileID);

                // Get the file extension.
                string incomingFileType = Path.GetExtension(incomingFileName);

                // Map the .sdkTest1 and .sdkTest2 files to different pages.
                switch (incomingFileType)
                {
                    case ".sdkTest1":
                        return new Uri("/sdkTest1Page.xaml?fileToken=" + fileID, UriKind.Relative);
                    case ".sdkTest2":
                        return new Uri("/sdkTest2Page.xaml?fileToken=" + fileID, UriKind.Relative);
                    default:
                        return new Uri("/MainPage.xaml", UriKind.Relative);
                }
            }
            // Otherwise perform normal launch.
            return uri;
        }
    }
}

アプリでこのような URI マッパー クラスを使用するには、それを App.xaml.cs ファイル内のアプリのフレームに割り当てます。InitializePhoneApplication メソッドでは、RootFrame.Navigated が割り当てられた直後に、URI マッパー クラスに等しい RootFrame.UriMapper プロパティを設定します。次の例では、AssociationUriMapper クラスはフレームの UriMapper プロパティに割り当てられています。

private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;

    // Create the frame but don't set it as RootVisual yet; this allows the splash
    // screen to remain active until the application is ready to render.
    RootFrame = new PhoneApplicationFrame();
    RootFrame.Navigated += CompleteInitializePhoneApplication;

    // Assign the URI-mapper class to the application frame.
    RootFrame.UriMapper = new AssociationUriMapper();

    // Handle navigation failures
    RootFrame.NavigationFailed += RootFrame_NavigationFailed;

    // Ensure we don't initialize again
    phoneApplicationInitialized = true;
}

アプリが起動し、初期化されるとき、URI マッパーが割り当てられます。アプリはページを表示する前に、URI マッパーの MapUri メソッドを呼び出し、起動すべきページを判別します。URI マッパーが返す URI は、アプリが起動するページです。

ページの起動時、そのページは、ページの NavigationContext オブジェクトの QueryString プロパティを使用して、(ページを起動した) URI のすべてのパラメーターにアクセスできます。たとえば、以下のコードでは URI のパラメーターと値のすべてを IDictionary オブジェクトに配置します。


// Get a dictionary of URI parameters and values.
IDictionary<string, string> queryStrings = this.NavigationContext.QueryString;

ファイルの取得

ディープ リンク URI からファイル トークンを取得した後、ファイルにアクセスするには、Windows.Phone.Storage.SharedAccess 名前空間から SharedStorageAccessManager 静的クラスを使用します。SharedStorageAccessManager には、次のメソッドが用意されています。

メソッド

戻り値の型

説明

GetSharedFileName

System.String

ファイルの名前 (ファイル拡張子を含む) を返します。

CopySharedFileAsync

Windows.Storage.StorageFile

指定の場所にファイルをコピーし、コピーを返します。

ファイルの起動

既に説明したように、別のアプリでファイルを開くことができるように、アプリでファイルを起動することもできます。これを行うには、Windows.System 名前空間の Launcher オブジェクトから LaunchFileAsync メソッドを使用します。たとえば、以下のコードはローカル ストレージから架空の Contoso バグ クエリ ファイルを起動します。


private async void LaunchFileButton_Click(object sender, RoutedEventArgs rea)
{

    // Access isolated storage.
    StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;

    // Access the bug query file.
    StorageFile bqfile = await local.GetFileAsync("file1.bqy");

    // Launch the bug query file.
    Windows.System.Launcher.LaunchFileAsync(bqfile);

}

URI の関連付けを使用すると、別のアプリで特別な URI を起動したときにアプリを自動的に起動することができます。URI の特別な点は、アプリの登録対象である URI スキーム名から始まっているという点です。URI スキーム名は、コロン (':') の直前にある URI の部分です。URI スキームには、URI スキーム名と、コロンの後にある URI のすべてが含まれます。たとえば、以下の URI スキームでは、contoso が URI スキーム名です。

contoso:ShowProducts?CategoryID=aea6ae1f-9894-404e-8bca-ec47ec5b9c6c

コロンの後、URI の残り部分は URI の関連付けを使用する方法に関係ありません。アプリが起動すると、アプリは URI を検査し、URI の内容に基づいて異なった動作をすることができます。この例では、受信側アプリは、特定のカテゴリ内のすべての製品を表示するように設計されています。

ヒントヒント:

自分が作成したアプリを起動することだけが目的の場合には、Windows.Phone.Management.Deployment 名前空間の API の使用を検討してください。この API を使用すると、自分が発行した他のアプリをチェックし、それらのアプリがインストールされていれば起動することができます。詳細については、「Windows Phone 8 の起動、再開、マルチタスク」を参照してください。

URI の関連付けの登録

URI の関連付けを処理するには、アプリ マニフェスト ファイルである WMAppManifest.xml で、対応する URI スキーム名を指定します。URI スキーム名には文字と数字の任意の組み合わせを使用できますが、組み込みアプリにより予約されている URI スキーム名は無視されます。詳細については、「Windows Phone 8 の予約済みのファイルと URI の関連付け」を参照してください。

URI の関連付けを登録するには、XML (テキスト) エディターを使用して WMAppManifest.xml を編集する必要があります。ソリューション エクスプローラーで、WMAppManifest.xml ファイルを右クリックし、[ファイルを開くアプリケーションの選択] をクリックします。[ファイルを開くアプリケーションの選択] ウィンドウで、[XML (テキスト) エディター] をクリックし、[OK] をクリックします。

アプリ マニフェスト ファイルの Extensions 要素では、Protocol 要素を使用して URI の関連付けを指定します。Extensions 要素は Tokens 要素の直後に置く必要があることに注意してください。アプリごとに最大 10 個の URI の関連付けを登録できます。以下の例に、contoso URI スキーム名を処理する架空のアプリの URI の関連付けを示します。


<Extensions>
  <Protocol Name="contoso" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
</Extensions>

Protocol 要素は以下の属性で構成されています。

属性

説明

名前

カスタム URI スキームのプレフィックス。数字、小文字、ピリオド ('.')、またはハイフン ('-') が含まれる、長さが 2 ~ 39 文字の文字列です。コロン (':')、または URI でコロンの後にあるすべての文字は含まれません。

NavUriFragment

常に encodedLaunchUri=%s と等しい必要があります。

TaskID

常に _default と等しい必要があります。

URI のリッスン

URI の関連付けを処理するためにアプリが自動的に起動した場合、ディープ リンク URI を使用してユーザーにアプリが示されます。URI の内部では、Protocol 文字列が、URI のソースが URI の関連付けであることを指定します。encodedLaunchuri という名前の URI パラメーターは、送信元アプリから送信された URI スキーム全体の URI エンコード バージョンと等しくなります。例として、以下のコードに、架空のアプリが contoso URI の関連付けの結果として起動した場合に、このアプリで表示される起動 URI を示します。


/Protocol?encodedLaunchUri=contoso%3AShowProducts%3FCategoryID%3Daea6ae1f-9894-404e-8bca-ec47ec5b9c6c

重要:重要:

起動側アプリの URI スキームで予約されているすべての文字は、自動的に % でエンコードされます。たとえば、あるアプリが URI “contoso:NewProducts” を起動すると、別のアプリはディープ リンク URI の /Protocol?encodedLaunchUri=contoso%3ANewProducts を受け取ります。

このアプリは、起動時に、着信したディープ リンク URI を、URI の関連付けを処理できるアプリ ページにマッピングします。以下の例に、ShowProducts.xaml ページを使用して Contoso の "製品の表示" 要求をマッピングする、カスタム URI マッパーを示します。Contoso URI スキーム名が使用されていない場合、完全な URI が MainPage.xaml ページに送信されます。

using System;
using System.Windows.Navigation;

namespace sdkAutoLaunch
{
    class AssociationUriMapper : UriMapperBase
    {
        private string tempUri;

        public override Uri MapUri(Uri uri)
        {
            tempUri = System.Net.HttpUtility.UrlDecode(uri.ToString());

            // URI association launch for contoso.
            if (tempUri.Contains("contoso:ShowProducts?CategoryID="))
            {
                // Get the category ID (after "CategoryID=").
                int categoryIdIndex = tempUri.IndexOf("CategoryID=") + 11;
                string categoryId = tempUri.Substring(categoryIdIndex);

                // Map the show products request to ShowProducts.xaml
                return new Uri("/ShowProducts.xaml?CategoryID=" + categoryId, UriKind.Relative);
            }

            // Otherwise perform normal launch.
            return uri;
            }
        }
}

アプリでこのような URI マッパー クラスを使用するには、それを App.xaml.cs ファイル内のアプリのフレームに割り当てます。InitializePhoneApplication メソッドでは、RootFrame.Navigated が割り当てられた直後に、URI マッパー クラスに RootFrame.UriMapper プロパティを割り当てます。次の例では、AssociationUriMapper クラスはフレームの UriMapper プロパティに割り当てられています。

private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;

    // Create the frame but don't set it as RootVisual yet; this allows the splash
    // screen to remain active until the application is ready to render.
    RootFrame = new PhoneApplicationFrame();
    RootFrame.Navigated += CompleteInitializePhoneApplication;

    // Assign the URI-mapper class to the application frame.
    RootFrame.UriMapper = new AssociationUriMapper();

    // Handle navigation failures
    RootFrame.NavigationFailed += RootFrame_NavigationFailed;

    // Ensure we don't initialize again
    phoneApplicationInitialized = true;
}

アプリが起動し、初期化されるとき、URI マッパーが割り当てられます。アプリはページを表示する前に、URI マッパーの MapUri メソッドを呼び出し、起動すべきページを判別します。URI マッパーが返す URI は、アプリが起動するページです。

ページの起動時、そのページは、ページの NavigationContext オブジェクトの QueryString プロパティを使用して、(ページを起動した) URI のすべてのパラメーターにアクセスできます。たとえば、以下のコードでは URI のパラメーターと値のすべてを IDictionary オブジェクトに配置します。


// Get a dictionary of URI parameters and values.
IDictionary<string, string> queryStrings = this.NavigationContext.QueryString;

URI の起動

関連起動 API を使用すると、アプリではカスタム URI を起動することで別のアプリを自動的に起動できます。これを行うには、Windows.System 名前空間の Launcher オブジェクトから Launcher.LaunchUriAsync(Uri) メソッドを使用します。たとえば、以下のコードでは架空の Contoso アプリを起動して新製品を表示します。


private async void LaunchContosoNewProductsButton_Click(object sender, RoutedEventArgs rea)
{
    // Launch URI.
    Windows.System.Launcher.LaunchUriAsync(new System.Uri("contoso:NewProducts"));
}

URI の関連付けを使用して URI が受信側アプリに渡された時点で、起動された URI 内のすべての予約済み文字は自動的に % でエンコードされます。たとえば、あるアプリが URI “contoso:NewProducts” を起動すると、別のアプリはディープ リンク URI の /Protocol?encodedLaunchUri=contoso%3ANewProducts を受け取ります。

近接通信を使用して URI を起動する

Windows Phone 8 は、近距離無線通信 (NFC) による近接通信をサポートしています。近接通信 API を使用して、お使いのアプリから別の電話で別のアプリを起動できます。別の電話が Windows Phone 8 デバイスで NFC をサポートしている場合、その電話は、ローカルで起動された URI を処理するときと同じようにして、URI の関連付けを処理します。アプリにおける近接通信の使用方法の詳細については、「Windows Phone 8 の近接通信」を参照してください。

ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device != null)
{
    long Id = device.PublishUriMessage(new System.Uri("contoso:NewProducts"));
    Debug.WriteLine("Published Message. ID is {0}", Id);

    // Store the unique message Id so that it 
    // can be used to stop publishing this message
}

ユーザーがアプリからファイルまたは URI を起動した場合、次に発生する動作は電話にインストールされているアプリによって決まります。特定のファイルまたは URI の関連付けを処理できるアプリが電話に存在しない場合、ユーザーには処理を行うアプリを取得するオプションが付与されます。

特定のファイルまたは URI の関連付けに対して登録されているアプリが電話に 1 つだけ存在する場合は、ユーザーが関連付けを開く必要があれば、そのアプリが自動的に起動します。ファイルまたは URI の関連付けに対して登録されているアプリをユーザーが電話で複数使用している場合は、ユーザーがファイルを開くたびに、ユーザーにはどのアプリを使用するかを確認するメッセージが表示されます。

ヒントヒント:

ファイルまたは URI の関連付けは、それを使用して有用な操作を実行できる場合以外は登録しないでください。アプリでアプリ メニューが頻繁に表示されるようになると、いつも選択しなければならない事態を回避するため、ユーザーがアプリの完全アンインストールを選択する可能性があります。

表示:
© 2014 Microsoft