😎

Hololens2でKnownFolders.DocumentsLibraryを扱おうとしたら「index out of range of

2021/09/28に公開

現象

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

解決した方法

参考

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

  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のビルド

Discussion