无权访问文件

时间:2015-08-07 09:42:19

标签: java android unity3d

我正在使用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);

3 个答案:

答案 0 :(得分:0)

您可能遗漏了其中一项权限

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

答案 1 :(得分:0)

在清单

中添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

答案 2 :(得分:0)

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

但为此,您必须在Unity项目中添加一些代码作为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);