0

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

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

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

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

我该如何解决这个问题?

4

1 回答 1

4

如果/data/data/com.frostbytedev.wifiqr是您的应用程序的私有目录,那么是的,您的应用程序有权读取该文件。您甚至不需要WRITE_EXTERNAL_STORAGE权限,因为它是“您的”目录。

但是,一旦您与另一个应用程序共享它,该应用程序也需要读取文件的权限。默认情况下,您的应用程序私有目录中的文件并非如此。您收到的错误来自无法访问的 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
于 2013-11-15T00:08:14.277 回答