Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开失败:EACCES(权限被拒绝)读取PNG,即使我有权限_Java_Android_Permissions_Share - Fatal编程技术网

Java 打开失败:EACCES(权限被拒绝)读取PNG,即使我有权限

Java 打开失败:EACCES(权限被拒绝)读取PNG,即使我有权限,java,android,permissions,share,Java,Android,Permissions,Share,在我的应用程序中,我通过ShareActionProvider类添加了一个共享按钮。我正在尝试共享一个从文件系统中提取的PNG。问题是,当我尝试与股票消息应用程序共享时,出现以下错误 com.google.android.mms.MmsException: /data/data/com.frostbytedev.wifiqr/files/QRCode.png: open failed: EACCES (Permission denied) 起初我以为这是我的权限,但我在清单中有以下权限 <

在我的应用程序中,我通过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" />
如果你想知道,他就是我保存图像的代码

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

如何解决此问题?

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

但是,一旦你与另一个应用程序共享该文件,该应用程序也需要读取该文件的权限。默认情况下,应用程序私有目录中的文件不是这样。您收到的错误来自无法访问的彩信应用程序

解决此问题的一个简单方法是将文件保存到每个应用程序都可以读取的位置。基本上,所有的东西都在里面

下一种可能是使该文件对其他应用程序可读,但将其保存在您拥有的地方。我应该这样做


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

如果
/data/data/com.frostbytedev.wifiqr
是您的应用程序的私有目录,则是,您的应用程序具有读取该文件的权限。您甚至不需要
WRITE\u EXTERNAL\u STORAGE
权限,因为它是“您的”目录

但是,一旦你与另一个应用程序共享该文件,该应用程序也需要读取该文件的权限。默认情况下,应用程序私有目录中的文件不是这样。您收到的错误来自无法访问的彩信应用程序

解决此问题的一个简单方法是将文件保存到每个应用程序都可以读取的位置。基本上,所有的东西都在里面

下一种可能是使该文件对其他应用程序可读,但将其保存在您拥有的地方。我应该这样做


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

我做了.setReadable和now get Enoint(没有这样的文件或目录)@SteveSmith听起来你的路径有问题(或者你在保存文件之前做了吗?)添加了另一段代码来回答这个问题,我做了.setReadable,现在get Enoint(没有这样的文件或目录)@SteveSmith听起来您的路径有问题(或者您在保存文件之前是否这样做了?)添加了另一段代码来回答这个问题