C# 如何在Android设备上访问Unity中的SD卡路径?

C# 如何在Android设备上访问Unity中的SD卡路径?,c#,android,unity3d,C#,Android,Unity3d,尝试以字符串形式返回Unity中的SD卡路径 AndroidJavaObject SDPath = new AndroidJavaObject("android.os.Environment"); AndroidJavaObject SDPath1 = SDPath.Call<AndroidJavaObject("getExternalStorageDirectory",null); string path_str = SDPath1.Call<string>("getAb

尝试以字符串形式返回Unity中的SD卡路径

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

AndroidJavaObject SDPath1=SDPath.Call也发现那些方法调用不起作用,所以我现在使用一种解决方法:您可以找到它。我希望有帮助


您还必须确保允许外部写入。

还发现那些方法调用不起作用,因此我现在使用一种解决方法:您可以找到它。我希望有帮助


您还必须确保允许外部写入。

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

    AndroidJavaObject[] externalFilesDirectories = context.Call<AndroidJavaObject[]>("getExternalFilesDirs", null);
要获取sd卡的路径,必须调用“GetExternalStorageDirectoriess”。这将为您提供所有可用外部存储、模拟存储和sd卡的列表

    AndroidJavaObject[] externalFilesDirectories = context.Call<AndroidJavaObject[]>("getExternalFilesDirs", null);
AndroidJavaObject[]externalFilesDirectories=context.Call(“getExternalFilesDirs”,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;
bool isRemovable=environment.CallStatic(“isExternalStorageRemovable”,目录);
bool isEmulated=environment.CallStatic(“isExternalStorageEmulated”,目录);
//我们找到sd卡了!
if(isRemovable&&isEmulated==false)
返回目录;
如果将其包装为一个函数,您将得到如下结果:

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", 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");
            }
      }
}
私有静态字符串GetAndroidExternalFilesDir()
{
使用(AndroidJavaClass unityPlayer=newandroidjavaclass(“com.unity3d.player.unityPlayer”))
{
使用(androidjavaobjectcontext=unityPlayer.GetStatic(“currentActivity”))
{
//获取所有可用的外部文件目录(模拟和SD卡)
AndroidJavaObject[]externalFilesDirectories=context.Call(“getexternalfilesdires”,null);
AndroidJavaObject仿真=空;
AndroidJavaObject sdCard=null;
for(int i=0;ibool isRemovable=environment.CallStatic我也遇到了同样的问题,我发现该方法是有效的,但不是您期望的方式。“GetExternalStorageDirectory”将为您提供一条到外部存储的可用路径,在大多数情况下,它是到模拟外部存储的路径,而不是sd卡的路径

    AndroidJavaObject[] externalFilesDirectories = context.Call<AndroidJavaObject[]>("getExternalFilesDirs", null);
要获取sd卡的路径,必须调用“GetExternalStorageDirectoriess”。这将为您提供所有可用外部存储、模拟存储和sd卡的列表

    AndroidJavaObject[] externalFilesDirectories = context.Call<AndroidJavaObject[]>("getExternalFilesDirs", null);
AndroidJavaObject[]externalFilesDirectories=context.Call(“getExternalFilesDirs”,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;
bool isRemovable=environment.CallStatic(“isExternalStorageRemovable”,目录);
bool isEmulated=environment.CallStatic(“isExternalStorageEmulated”,目录);
//我们找到sd卡了!
if(isRemovable&&isEmulated==false)
返回目录;
如果将其包装为一个函数,您将得到如下结果:

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", 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");
            }
      }
}
私有静态字符串GetAndroidExternalFilesDir()
{
使用(AndroidJavaClass unityPlayer=newandroidjavaclass(“com.unity3d.player.unityPlayer”))
{
使用(androidjavaobjectcontext=unityPlayer.GetStatic(“currentActivity”))
{
//获取所有可用的外部文件目录(模拟和SD卡)
AndroidJavaObject[]externalFilesDirectories=context.Call(“getexternalfilesdires”,null);
AndroidJavaObject仿真=空;
AndroidJavaObject sdCard=null;
for(int i=0;i