がりらぼ

WindowsRuntimeの応援ブログ

WinRT:USB接続でアプリを起動するには

自動再生コンテンツ

自動再生デバイスとは、初めてUSBメモリなどのデバイスが接続されたときにどのプログラムを使うかを選択することで次回以降接続されたときに自動でプログラムが起動できる機能です。

f:id:garicchi:20141130184005p:plain

通常はexplolerなどを登録することでファイル閲覧をすることができますが、この自動再生コンテンツにストアアプリを登録することができます。

マニフェストファイルを編集する

自動再生コンテンツに登録するには、マニフェストファイルの宣言タブで「自動再生コンテンツ」を追加します。

動詞は、OnFileActivatedメソッドにパラメータとして渡されます。

アクション表示名とは、自動再生が起動したときに表示される名前です。

コンテンツイベントとは、あらかじめ決まっている文字列を記入する必要があります。

以下のデベロッパーセンターに書いてる一覧から選びます。

自動再生コンテンツ -Windowsデベロッパーセンター

今回はUSBのStorageにアクセスしたいので「StorageOnArrival」を指定します。

f:id:garicchi:20141130184012p:plain

さらに、宣言タブでファイルの関連付けを追加します。

今回はUSBメモリ内のjpgファイルを列挙しようと思うので.jpgを指定します。

WindowsRuntimeでは関連付けに登録された拡張子のファイルしか認識することができません。

ですので、USBメモリ内のファイルを列挙したい場合、その拡張子をあらかじめ登録する必要があります。

f:id:garicchi:20141130184018p:plain

さらに、機能タブから、リムーバブル領域にチェックを入れ、アクセスを許可します。

f:id:garicchi:20141130184031p:plain

OnFileActivatedメソッドをオーバーライドする

以上でUSBが接続されたときに、自動再生でアプリを選択することができます。

次は自動再生でアプリが起動したときのアクションを追加します。

自動再生による起動は、App.xaml.csのOnFileActivatedメソッドが呼ばれます。

OnFileActivatedメソッドをoverrideしましょう。

FileActivatedEventArgsのVerbプロパティには、マニフェストファイルの自動再生コンテンツで指定した動詞の文字列が渡されます。

先ほど自動再生コンテンツで"storage"と指定したのでVerbが"storage"の場合、自動再生コンテンツで起動したことが判断できます。

自動再生コンテンツの場合、FilePage1.xamlを作ってそのページに遷移しましょう。

FileActivatedEventArgsのFilesプロパティにファイル一覧が渡されるのでそれをナビゲーションパラメータとしてわたしましょう。

protected override void OnFileActivated(FileActivatedEventArgs args)
{
    if (args.Verb == "storage")
    {
        Frame rootFrame = Window.Current.Content as Frame;

        rootFrame = new Frame();
        rootFrame.Navigate(typeof(FilePage1),args.Files);
        Window.Current.Content = rootFrame;
        Window.Current.Activate();
    }
    
    base.OnFileActivated(args);
}

遷移先のFilePage1.xamlのOnNavigatedToメソッドで、パラメータのFileListを取得します。

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    IReadOnlyList<IStorageItem> fileList=e.Parameter as IReadOnlyList<IStorageItem>;
    StorageFolder rootFolder=  fileList.First() as StorageFolder;
    
    IReadOnlyList<IStorageFolder> folders=await rootFolder.GetFoldersAsync();
    listBox_folders.ItemsSource = folders.Select(q => q.Name);

    IReadOnlyList<IStorageFile> files = await rootFolder.GetFilesAsync();
    listBox_files.ItemsSource = files.Select(q=>q.Name);
    base.OnNavigatedTo(e);
}

FilePage1.xamlXamlはこんな感じで

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <TextBlock HorizontalAlignment="Left" Margin="148,76,0,0" TextWrapping="Wrap" Text="StorageLaunched!" VerticalAlignment="Top" FontSize="36"/>
    <ListBox x:Name="listBox_folders" HorizontalAlignment="Left" Height="434" Margin="262,193,0,0" VerticalAlignment="Top" Width="298"/>
    <TextBlock HorizontalAlignment="Left" Margin="262,145,0,0" TextWrapping="Wrap" Text="Folders" VerticalAlignment="Top" FontSize="36"/>
    <TextBlock HorizontalAlignment="Left" Margin="716,150,0,0" TextWrapping="Wrap" Text="Files" VerticalAlignment="Top" FontSize="36"/>

    <ListBox x:Name="listBox_files" HorizontalAlignment="Left" Height="434" Margin="701,193,0,0" VerticalAlignment="Top" Width="298"/>

</Grid>

これでアプリがインストールされたデバイスには、USBメモリが刺さると自動再生でファイル一覧を列挙することができます。

f:id:garicchi:20141130184041p:plain

USB接続でアプリを起動するには | garicchi.com