Hololens2でKnownFolders.DocumentsLibraryを扱おうとしたら「index out of range of ToggleList: 0」エラーが出た


現象

Hololens2のエミュレータの段階で、タイトルのようなエラーがでました

再現コード

string UWP_DIR_NAME = "myDir";
string FILE_NAME = "obj_info.json";

string jsonString = "{\"objs\":{\"x\":100,\"y\":200,\"z\":300}";

await Task.Run(async () =>
{
    try
    {
        var readFolder = await KnownFolders.DocumentsLibrary.GetFolderAsync(UWP_DIR_NAME);
        var readFile = await readFolder.GetFileAsync(FILE_NAME);
        using (var stream = await readFile.OpenStreamForReadAsync())
        {
            var bytes = new byte[stream.Length];
            await stream.ReadAsync(bytes, 0, bytes.Length);
            var text = System.Text.Encoding.UTF8.GetString(bytes);
            jsonString = text;
        }
    }
    catch (Exception e)
    {
        var folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync(UWP_DIR_NAME, CreationCollisionOption.OpenIfExists);
        var file = await folder.CreateFileAsync(FILE_NAME, CreationCollisionOption.ReplaceExisting);
        using (var stream = await file.OpenStreamForWriteAsync())
        {
            var bytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
            await stream.WriteAsync(bytes, 0, bytes.Length);
        }
    }
});

あるフォルダ内のファイルを見に行って、なければダミーのjsonファイルを作るというもの

実際のコードではないけど、var多いし、もっときれいに書きたいやつです

発生したエラー

catchのほうでもエラーが出てしまってこの後の処理がうまく通っていなかった

エラー内容は「index out of range of ToggleList: 0」

エラー箇所はそのあとたくさんDebug.Logを使ってvar readFolder = await KnownFolders.DocumentsLibrary.GetFolderAsync(UWP_DIR_NAME);らへんだと判明

ちなみにエミュレータでDebug.Logを見る方法

参考:https://zenn.dev/fumiyahr/articles/a97842e3954560

いちいちダウンロードがめんどうですが、できました

環境

  • Unity: v2019.4.18f1
  • MRTK: v10.0.19041
  • Hololens2エミュレータ: v10.0.20348
  • Visual Studio 2019

解決した方法

参考
* https://docs.microsoft.com/en-us/uwp/api/windows.storage.knownfolders?view=winrt-20348
* https://www.fixes.pub/program/379935.html
* https://www.fixes.pub/program/270850.html
* https://qiita.com/miyaura/items/75ec7f3d6ab0500ccf72
* https://blog.kaorun55.com/entry/2017/03/04/203152

エミュレータでの簡単な手順

  1. Unity上でUWP向けにビルド
  2. Package.appxmanifestをテキストエディタなどで開き、<uap:Capability Name="documentsLibrary" />を追加
  3. VisualStudioでエミュレータのプロジェクトを開いてPackage.appxmanifestを探して開き、宣言追加
  4. エミュレータ実行

実機での簡単な手順

  1. Package.appxmanifestをテキストエディタなどで開き、<uap:Capability Name="documentsLibrary" />を追加
  2. VisualStudioでエミュレータのプロジェクトを開いてPackage.appxmanifestを探して開き、宣言追加
  3. Unity内でMRTKのビルド