デコシノニッキ

ホロレンジャーの戦いの記録

HoloLensとUSB経由でファイルをやり取りする

www.tattichan.work

以前,検出まではしたのですがファイルをやり取りするところまではできていませんでした。
Microsoft Layout importerではPCからUSB経由でHoloLensに直接ファイルを置いたり読んだりすることができます。

ファイルをRestAPI経由でやりとりするのは開発用のDevicePortalを有効にする必要があるので一般向けではないですし,HoloLensアプリからサーバを立ち上げるのも現実的ではなく,やはりUSB経由でファイルをやり取りできるというのは何かと便利です。

やり方

今回はサンプルとしてHoloLensのカメラロールにアクセスしてみます。

HoloLensにアクセスするにはRemovableStorageを使う必要があります。
Package.appxmanifestの機能から「リムーバブル記憶領域」を有効にします。

f:id:haikage1755:20190426173636p:plain:w450

この時,GetFoldersAsync("HoloLens名")でアクセスしてもUnAuthorizedで弾かれます(わからん…)

            var externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
            var targetHoloLens  = (await externalDevices.GetFoldersAsync())
                .First(device => device.Name == "HoloLens名");

リソースにアクセスするには再帰的にフォルダにアクセスしなければいけません。

            // HoloLensのリソースにアクセスする
            var externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
            var targetHoloLens  = (await externalDevices.GetFoldersAsync())
                .First(device => device.Name == "HoloLens名");

            // 再帰的にアクセスする
            var internalStorage = (await targetHoloLens.GetFolderAsync("Internal Storage"));
            var pictures        = (await internalStorage.GetFolderAsync("Pictures"));
            var cameraRoll      = (await pictures.GetFolderAsync("Camera Roll"));

続いてファイルの一覧を取得します。
ファイルを取得するには,「ファイルの種類の関連付け」が必要です。カメラロールの画像は「.jpg」で保存されているので,サポートされるファイルの種類には以下のように設定します。

f:id:haikage1755:20190426173458p:plain:w450

Optionで拡張子を指定してファイルを取得します。

            // HoloLensのリソースにアクセスする
            var externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
            var targetHoloLens  = (await externalDevices.GetFoldersAsync())
                .First(device => device.Name == "HoloLens名");

            // 再帰的にアクセスする
            var internalStorage = (await targetHoloLens.GetFolderAsync("Internal Storage"));
            var pictures        = (await internalStorage.GetFolderAsync("Pictures"));
            var cameraRoll      = (await pictures.GetFolderAsync("Camera Roll"));

            // 拡張子でフィルタリングする
            var query = cameraRoll.CreateFileQueryWithOptions(
                new QueryOptions(
                       CommonFileQuery.DefaultQuery,
                       new string[]{".jpg"}));

            // ファイル名を列挙する
            foreach (var file in await query.GetFilesAsync())
                Debug.WriteLine(file.Name);

おまけ 外からファイルをコピーして入れる

            // HoloLensのリソースにアクセスする
            var externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
            var targetHoloLens  = (await externalDevices.GetFoldersAsync())
                .First(device => device.Name == "HoloLens名");

            // 再帰的にアクセスする
            var internalStorage = (await targetHoloLens.GetFolderAsync("Internal Storage"));
            var pictures        = (await internalStorage.GetFolderAsync("Pictures"));
            var cameraRoll      = (await pictures.GetFolderAsync("Camera Roll"));

            // 拡張子でフィルタリングする
            var query = cameraRoll.CreateFileQueryWithOptions(
                new QueryOptions(
                       CommonFileQuery.DefaultQuery,
                       new string[]{".jpg"}));

            // Pictureライブラリからてきとーにサンプル画像をとってくる
            var pictureLibrary = Windows.Storage.KnownFolders.PicturesLibrary;
            var sampleFile      = await pictureLibrary.GetFileAsync("sample.jpg");

            // 画像をコピーする
            await sampleFile.CopyAsync(cameraRoll);

参考

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」