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」の「ピクチャライブラリ」を直接チェックしてください。
ドキュメント
ドキュメントへのファイル書き込みサンプルです。
// ドキュメントフォルダ // 1. Package.appxmanifestを開き // 「宣言」から「ファイルの種類の関連付け」を行い、書き込むファイルの拡張を追加する // 2. Package.appxmanifestを「コードを表示」で開き下記を追加する // <uap:Capability Name="documentsLibrary" /> { 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」 以下に作成されます。
// ローカルフォルダー // 「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); } }