2013-11-14 91 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

相關問題