在与Unity的Android上列出SD卡上的TXT文件

发布于 2025-02-13 17:07:31 字数 1115 浏览 0 评论 0原文

我想使用Unity Game Engine在Android上的SD卡上的文件夹中列出所有TXT文件。

  • 权限read_external_storagewrite_external_storage已给出了
  • TXT文件,我可以在Android上使用我的文件浏览器看到它们。当我连接手机时,我还可以在Windows中看到它们

,但是Unity的C#API没有在文件夹中列出任何TXT文件:

// sdCardFolder is for example "/storage/9C33-6BBD/MyFolderOnSdCard"
string[] filePaths = Directory.GetFiles(sdCardFolder, "*", SearchOption.AllDirectories);
filePaths.ForEach(filePath => Debug.Log(filePath));

但是它仅显示一些文件。它似乎列出了图像(JPG,PNG),音频文件(MP3,OGG),视频文件(AVI)等等。 但是它没有列出任何TXT文件。

我将文件从bla.txt重命名为bla.jpgbla.foo。列出了JPG文件,但bla.foo却没有。因此,我认为默认情况下,Android仅提供对“典型”媒体和应用程序文件的访问权限。

问题:

  • 为什么Unity的C#API未列出TXT文件?
  • 如何访问TXT文件?
  • 也许该应用需要更多的权限?
  • 是否可以要求Android以完全访问SD卡上的特定文件夹?
    • 我的一些Android应用程序显示一个对话框,以在访问SD卡上的SD卡上选择一个文件夹。也许这是必需的?

我正在使用Android 12,Unity 2021.3.4f1进行测试。

动机

我有一个卡拉OK游戏,用户可以在其中添加自己的歌曲。歌曲格式使用TXT(纯文本)文件。我想使用户能够将他们的歌曲库放在SD卡上。

I want to list all txt files in a folder on an SD card on Android using the Unity game engine.

  • permissions READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE are given
  • the txt files exist, I can see them using my file browser on Android. I can also see them in Windows when I connect my phone

But Unity's C# API is not listing any txt files in the folder:

// sdCardFolder is for example "/storage/9C33-6BBD/MyFolderOnSdCard"
string[] filePaths = Directory.GetFiles(sdCardFolder, "*", SearchOption.AllDirectories);
filePaths.ForEach(filePath => Debug.Log(filePath));

But it shows only some of the files. It seems to list images (jpg, png), audio files (mp3, ogg), video files (avi), and maybe more.
But it does not list any txt file.

I renamed a file from bla.txt to bla.jpg and bla.foo. The jpg file was listed, but bla.foo was not. Thus, I assume that Android by default only provides access to "typical" media and application files.

Question:

  • Why are the txt files not listed by Unity's C# API?
  • How do I get access to the txt files?
  • Maybe the app requires more permissions?
  • Is it possible to ask Android for full access to a specific folder on an SD card?
    • Some of my Android apps show a dialog to select a folder on an SD card before accessing stuff. Maybe this is required?

I am testing with Android 12, Unity 2021.3.4f1.

Motivation

I have a karaoke game where users can add their own songs. The song format uses txt (plain text) files. I want to enable users to put their song library on an SD card.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

分開簡單 2025-02-20 17:07:31

Android确实确实限制了文件的可见度。但不是属于应用程序本身的文件夹。您可以在Android上通过getExternalFilesdirs找到这些文件夹。

这是一个解释如何在Unity中调用GetExternalFilesdirs: http:http:http:http: //Anja-haumann.de/unity-how-to-save-on-sd-card/

private static string GetAndroidExternalFilesDir()
{
     using (AndroidJavaClass unityPlayer = 
            new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
     {
          using (AndroidJavaObject context = 
                 unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
          {
               // Get all available external file directories (emulated and sdCards)
               AndroidJavaObject[] externalFilesDirectories = 
                                   context.Call<AndroidJavaObject[]>
                                   ("getExternalFilesDirs", (object)null);

               AndroidJavaObject emulated = null;
               AndroidJavaObject sdCard = null;

               for (int i = 0; i < externalFilesDirectories.Length; i++)
               {
                    AndroidJavaObject directory = externalFilesDirectories[i];
                    using (AndroidJavaClass environment = 
                           new AndroidJavaClass("android.os.Environment"))
                    {
                        // Check which one is the emulated and which the sdCard.
                        bool isRemovable = environment.CallStatic<bool>
                                          ("isExternalStorageRemovable", directory);
                        bool isEmulated = environment.CallStatic<bool>
                                          ("isExternalStorageEmulated", directory);
                        if (isEmulated)
                            emulated = directory;
                        else if (isRemovable && isEmulated == false)
                            sdCard = directory;
                    }
               }
               // Return the sdCard if available
               if (sdCard != null)
                    return sdCard.Call<string>("getAbsolutePath");
               else
                    return emulated.Call<string>("getAbsolutePath");
            }
      }
}

请注意Read_External_storage仍然需要权限。

我发现在由getexternalfilesdirs返回的文件夹中,所有文件均可看到Unity的C#API。

Android indeed seems to limit the visiblity of files. But not inside folders that belong to the app itself. You can find these folders via getExternalFilesDirs on Android.

Here is an explanation how to call getExternalFilesDirs in Unity: http://anja-haumann.de/unity-how-to-save-on-sd-card/

private static string GetAndroidExternalFilesDir()
{
     using (AndroidJavaClass unityPlayer = 
            new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
     {
          using (AndroidJavaObject context = 
                 unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
          {
               // Get all available external file directories (emulated and sdCards)
               AndroidJavaObject[] externalFilesDirectories = 
                                   context.Call<AndroidJavaObject[]>
                                   ("getExternalFilesDirs", (object)null);

               AndroidJavaObject emulated = null;
               AndroidJavaObject sdCard = null;

               for (int i = 0; i < externalFilesDirectories.Length; i++)
               {
                    AndroidJavaObject directory = externalFilesDirectories[i];
                    using (AndroidJavaClass environment = 
                           new AndroidJavaClass("android.os.Environment"))
                    {
                        // Check which one is the emulated and which the sdCard.
                        bool isRemovable = environment.CallStatic<bool>
                                          ("isExternalStorageRemovable", directory);
                        bool isEmulated = environment.CallStatic<bool>
                                          ("isExternalStorageEmulated", directory);
                        if (isEmulated)
                            emulated = directory;
                        else if (isRemovable && isEmulated == false)
                            sdCard = directory;
                    }
               }
               // Return the sdCard if available
               if (sdCard != null)
                    return sdCard.Call<string>("getAbsolutePath");
               else
                    return emulated.Call<string>("getAbsolutePath");
            }
      }
}

Note that READ_EXTERNAL_STORAGE permission is still required.

I found that in the folders returned by getExternalFilesDirs, all files are visible to Unity's C# API.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文