2013-11-14 144 views
0

在我的应用程序中,我通过ShareActionProvider类添加了一个Share按钮。我试图分享我从文件系统中提取的PNG。问题是,我得到了我抛出以下错误,当我尝试与股票消息应用程序打开失败:EACCES(Permission denied)即使我有权限读取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

如果/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 
+0

我做了.setReadable和现在得到ENOENT(没有这样的文件或目录) –

+0

@SteveSmith听起来像有什么不对您的路径(或做你做,你保存文件之前?)新增替代件的代码来回答应该工作 – zapl

+0

setReadable()适用于我。 – porquero

相关问题