ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

HoloLensでのアプリからのファイル書き込み

HoloLensでのファイル書き込みについて紹介します。 HoloLensのファイルアクセスはUWP環境になるので、さまざま設定や制約があります。アクセスできるフォルダは下記を参照してください。

とはいえ、Device PortalのFile Explorerからアクセスできる方が何かと便利なので、必然的に「カメラロール」、「ドキュメント」、「アプリのローカルフォルダ」の3種類になると思います。 f:id:kaorun55:20170304201241p:plain

それぞれの特長をまとめます。これらを踏まえて決めればよいかと思います。

  • カメラロール
    • ピクチャーライブラリの権限が必要
    • フォルダが作れない
    • 自動的に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」をチェックします。

f:id:kaorun55:20170304201922p:plain

UWPプロジェクトの上書きなどで権限がうまく入らない場合には「Package.appxmanifest」の「ピクチャライブラリ」を直接チェックしてください。

f:id:kaorun55:20170304202015p:plain

ドキュメント

ドキュメントへのファイル書き込みサンプルです。

// ドキュメントフォルダ
// 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" />

f:id:kaorun55:20170304202853p:plain

ファイル関連付け

Package.appxmanifestを開き「宣言」から「ファイルの種類の関連付け」を行い、書き込むファイルの拡張を追加します。

f:id:kaorun55:20170304202724p:plain

アプリのローカルフォルダ

特に権限の必要もなく書き込めます。ただし、デプロイごとにファイルが初期化されます。 ファイルは「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);
    }
}