【问题标题】:No permission to access file没有访问文件的权限
【发布时间】:2015-08-07 09:42:19
【问题描述】:

我正在使用 Unity 游戏引擎创建游戏。在这个游戏中,我截取了一个屏幕截图并将其保存到 Unity 的默认文件夹(“Application.persistentDataPath”):

/data/data/de.mytest.mygame/files/Screenshot.png

现在我想通过 Android 分享这个屏幕截图。为此,我从 Unity 调用相应的 java 代码。

这例如返回 TRUE:

AndroidJavaObject fileObject = new AndroidJavaObject("java.io.File", imageFileName);
bool fileExist = fileObject.Call<bool>("exists");
Debug.Log("File exist : " + fileExist);

但是当我尝试使用 android.content.Intent 和 putExtra 创建共享意图来共享此图像时,我得到一个异常:

java.io.FileNotFoundException: /data/data/de.mytest.mygame/files/Screenshot.png:打开失败:EACCES (权限被拒绝)

如何解决这个权限问题?

编辑: 意图是这样创建的:

 AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");

intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
intentObject.Call<AndroidJavaObject>("setType", "image/*");
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), subject);
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TITLE"), title);
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), message);

AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
AndroidJavaObject fileObject = new AndroidJavaObject("java.io.File", imageFileName);
AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("fromFile", fileObject);

intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject);
AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
currentActivity.Call ("startActivity", intentObject);

【问题讨论】:

  • 您在 manifest.xml 中定义了哪些权限?
  • 你是如何准确构建你的意图的?

标签: java android unity3d


【解决方案1】:

您可能缺少其中一项权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

【讨论】:

    【解决方案2】:

    在清单中添加权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    【讨论】:

    • 嗯,可能是这个。但我的 Nexus 5 甚至没有外部存储。那么这里的“外部”到底是什么意思呢?
    • 检查文件路径并检查该路径上可用的文件,因为 java.io.FileNotFoundException 也会发生
    • 文件在那里没问题。但是添加权限并没有帮助:-(
    【解决方案3】:

    由于安全问题,无法从 App 文件夹轻松共享文件,并且您不能仅在应用程序之间共享 File 对象。通常的方法是实现ContentProvider 或只使用FileProvider。所以你分享的是文件的 URI,其他应用从提供者那里读取它。

    但为此,您必须在 Unity 项目中添加一些带有 Provider 作为 Android plugin 的代码,并在清单中声明它以便可以调用它。

    我认为使用Environment的方法将文件保存在共享图片文件夹中可能更容易(虽然不是很干净):

    File path = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File file = new File(path, "Screenshot.png");
    // write to that file
    

    然后使用 Intent.EXTRA_STREAM 作为额外的密钥共享文件的 URI:

        intent.putExtra(Intent.EXTRA_STREAM, imageUri);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多