HoloLensでのファイル書き込みについて紹介します。
HoloLensのファイルアクセスはUWP環境になるので、さまざま設定や制約があります。アクセスできるフォルダは下記を参照してください。
とはいえ、Device PortalのFile Explorerからアクセスできる方が何かと便利なので、必然的に「カメラロール」、「ドキュメント」、「アプリのローカルフォルダ」の3種類になると思います。
それぞれの特長をまとめます。これらを踏まえて決めればよいかと思います。
- カメラロール
- ピクチャーライブラリの権限が必要
- フォルダが作れない
- 自動的にOneDriveで同期される
- ドキュメント
- 権限のつけ方が特殊
- 指定した拡張子のファイルのみアクセス可能
- アプリのローカルフォルダ
サンプルコード
こちらのリポジトリに置いています。
カメラロール
カメラロールへのファイル書き込みサンプルです。
{
var file = await KnownFolders.CameraRoll.CreateFileAsync("test.txt",
CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
{
var bytes = System.Text.Encoding.UTF8.GetBytes(@"テストてすとtest");
await stream.WriteAsync(bytes, 0, bytes.Length);
}
}
権限はUnityエディター上で「PuctureLibrary」をチェックします。
UWPプロジェクトの上書きなどで権限がうまく入らない場合には「Package.appxmanifest」の「ピクチャライブラリ」を直接チェックしてください。
ドキュメント
ドキュメントへのファイル書き込みサンプルです。
{
var folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync("DocumentLibraryTest",
CreationCollisionOption.OpenIfExists);
var file = await folder.CreateFileAsync("test.txt", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
{
var bytes = System.Text.Encoding.UTF8.GetBytes(@"テストてすとtest");
await stream.WriteAsync(bytes, 0, bytes.Length);
}
}
ドキュメントフォルダへのアクセス権限付与
ドキュメントフォルダへのアクセス権限は「Package.appxmanifest」への設定と、ファイル関連付けの2つを行います。
Package.appxmanifestの設定
Package.appxmanifestを「コードを表示」で開き下記を追加します。
<uap:Capability Name="documentsLibrary" />
ファイル関連付け
Package.appxmanifestを開き「宣言」から「ファイルの種類の関連付け」を行い、書き込むファイルの拡張を追加します。
アプリのローカルフォルダ
特に権限の必要もなく書き込めます。ただし、デプロイごとにファイルが初期化されます。
ファイルは「User Files\LocalAppData\<アプリ名>\LocalState」 以下に作成されます。
{
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(
"DocumentLibraryTest", CreationCollisionOption.OpenIfExists);
var file = await folder.CreateFileAsync("test.txt", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
{
var bytes = System.Text.Encoding.UTF8.GetBytes(@"テストてすとtest");
await stream.WriteAsync(bytes, 0, bytes.Length);
}
}