以前,検出まではしたのですがファイルをやり取りするところまではできていませんでした。
Microsoft Layout importerではPCからUSB経由でHoloLensに直接ファイルを置いたり読んだりすることができます。
ファイルをRestAPI経由でやりとりするのは開発用のDevicePortalを有効にする必要があるので一般向けではないですし,HoloLensアプリからサーバを立ち上げるのも現実的ではなく,やはりUSB経由でファイルをやり取りできるというのは何かと便利です。
やり方
今回はサンプルとしてHoloLensのカメラロールにアクセスしてみます。
HoloLensにアクセスするにはRemovableStorageを使う必要があります。
Package.appxmanifestの機能から「リムーバブル記憶領域」を有効にします。
この時,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」で保存されているので,サポートされるファイルの種類には以下のように設定します。
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);