开放失败:EACCES(权限被拒绝)即使我有权限阅读PNG

时间:2013-11-14 23:47:46

标签: java android permissions share

在我的应用程序中,我通过ShareActionProvider类添加了一个Share按钮。我正在尝试共享一个从文件系统中提取的PNG。问题是当我尝试与股票消息应用程序分享它时,我得到以下错误

com.google.android.mms.MmsException: /data/data/com.frostbytedev.wifiqr/files/QRCode.png: open failed: EACCES (Permission denied)

起初我认为这是我的权限,但我的Manifest中有以下权限。

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

我试图从文件系统中获取它的地方是:

Uri uri = Uri.fromFile(new File(getFilesDir(), "/QRCode.png"));
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("image/*");
                intent.putExtra(Intent.EXTRA_STREAM,uri);
                provider.setShareIntent(intent);

如果您想知道,他是我保存图片的代码

String fileName = getFilesDir() + "/QRCode.png";
                etSSID.setText(fileName);
                OutputStream stream = null;
                try {
                    stream = new FileOutputStream(fileName);
                    bmp.compress(Bitmap.CompressFormat.PNG, 80, stream);
                    stream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

如果/data/data/com.frostbytedev.wifiqr是您应用的私人目录,则是,您的应用有权读取该文件。你甚至不需要WRITE_EXTERNAL_STORAGE的许可,因为它是你的&#34;你的&#34; 。目录

但是,一旦您与其他应用分享,该应用也需要获得读取文件的权限。默认情况下,应用程序专用目录中的文件不是这种情况。您收到的错误来自无法访问的MMS应用程序。

解决问题的一种简单方法是将文件保存到每个应用都可以读取的位置。基本上是Environment.getExternalStorageDirectory()中的所有内容。

下一个可能性是让该文件对其他应用程序可读,但保留在您拥有它的位置。 File#setReadable(true, false)应该这样做。


Context也有很好的方法可以简化以可读模式创建文件。

String fileName = getFileStreamPath("QRCode.png").getPath();
etSSID.setText(fileName);
OutputStream stream = null;
try {
    stream = openFileOutput("QRCode.png", Context.MODE_WORLD_READABLE);
    bmp.compress(Bitmap.CompressFormat.PNG, 80, stream);
    stream.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

...

Uri uri = Uri.fromFile(getFileStreamPath("QRCode.png"));
.. share