c# - 如何在 Android 设备上访问 Unity 中的 SDCard 路径?

标签 c# android unity-game-engine

尝试以字符串形式返回 Unity 中的 SDCard 路径。

AndroidJavaObject SDPath = new AndroidJavaObject("android.os.Environment"); 
AndroidJavaObject SDPath1  = SDPath.Call<AndroidJavaObject("getExternalStorageDirectory",null);
string path_str = SDPath1.Call<string>("getAbsolutePath");

但是它似乎不起作用。我尝试将字符串传递给 UI 元素,但没有呈现任何内容。我已经测试了 UI 元素,并且该方面的代码正在运行。有什么想法吗?

谢谢!

最佳答案

编辑/修复:统一更新使函数调用不明确

我遇到了同样的问题,发现该方法有效,但不是您期望的那样。 “GetExternalStorageDirectory”将为您提供外部存储的可用路径之一,在大多数情况下,它是模拟外部存储的路径,而不是 SD 卡的路径。

要获取 SD 卡的路径,您必须调用“GetExternalStorageDirectories”。这将为您提供所有可用外部存储、模拟存储和 SD 卡的列表。

    AndroidJavaObject[] externalFilesDirectories = context.Call<AndroidJavaObject[]>("getExternalFilesDirs", (object)null);

之后,您只需使用 java 函数“isExternalStorageRemovable”和“isExternalStorageEmulated”来区分模拟存储和外部存储。如果它不是模拟且可移动的,那么您找到了 SD 卡的路径。

bool isRemovable = environment.CallStatic<bool>("isExternalStorageRemovable", directory); 
bool isEmulated = environment.CallStatic<bool>("isExternalStorageEmulated", directory);

// We found the sd card!
if (isRemovable && isEmulated == false) 
    return directory;

如果将其包装到一个函数中,您将得到如下所示的内容:

   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");
            }
      }
}

关于c# - 如何在 Android 设备上访问 Unity 中的 SDCard 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40140495/

相关文章:

android - 我可以验证用户是否拥有用于在线功能的 Android 应用程序的合法副本?

android - Daydream 应用程序启动时崩溃

java - 如何获取 View 的宽度和高度

java - 异步任务 : onPostExecute runs twice?

android - 如何使用 Android 模拟器使用 monkeyrunner 模拟屏幕旋转?

c# - WPF 工具包折线图的性能

c# - 对象不断克隆C# unity

c# - 调用 Sitefinity WCF Web 服务时出现错误 401

c# - 在列表框 Imap/pop3 的文本框中显示电子邮件正文

c# - 检查大量文件中是否存在字符串的最快方法