簡體   English   中英

寫入SD卡“java.io.FileNotFoundException:Permission denied”

[英]Write to SD card “java.io.FileNotFoundException: Permission denied”

stackoverflow上有很多類似的問題,但我仍然無法找到解決我的特定問題的方法:

我有一個具有WRITE_EXTERNAL_STORAGE權限的應用程序和一個未導出的文件提供程序

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.cgogolin.library"
      ...
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="23" />
      ...
      <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.cgogolin.library.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
      </provider>
</application>

provider_paths.xml進一步指定為

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external_files" path="."/>
  <root-path name="external_files2" path="/storage/"/>
</paths>

我想用它來提供從SD卡到其他應用程序的文件(在這種情況下,我的應用程序或多或少地作為文件瀏覽器,但不完全......)。

當我使用API​​級別23時,我還通過調用動態請求權限

requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_PERMISSION_REQUEST);

將顯示對話框窗口,然后單擊“允許”(並在由於無法寫入外部存儲器中描述的錯誤重新啟動應用程序, 除非在授予權限后重新啟動應用程序 ),應用程序正確獲取權限,我可以驗證通過測試是否

android.support.v4.content.ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

這確實是事實。 我也可以從SD卡中獲取一個Uri到一個File文件

Uri uri = android.support.v4.content.FileProvider.getUriForFile(context, "com.cgogolin.library.fileprovider", file);

我可以從該文件中讀取,例如,我可以成功啟動Intent.ACTION_VIEW以在外部應用程序中打開該文件。

但是:盡管有寫權限,我無法寫入文件。 所有嘗試使用以下任一方法打開OutputStreamParcelFileDescriptoruri

context.getContentResolver().openOutputStream(uri, "wa");
context.getContentResolver().openFileDescriptor(uri, "wa");

直接從我的應用程序或通過Intent打開的應用程序導致a

java.io.FileNotFoundException: Permission denied

我的錯誤在哪里? 我認為在checkSelfPermission()告訴我我有WRITE_EXTERNAL_STORAGE我應該能夠這樣做。

我想用它來提供從SD卡到其他應用程序的文件

首先, FileProvider上沒有記錄的root-path

其次,在非常特定的位置之外,您沒有對可移動存儲的讀取或寫入訪問權限(例如, getExternalFilesDirs()返回的第二個和后續值)。 外部存儲權限與可移動存儲無關。

答案是讓用戶通過Intent.ACTION_OPEN_DOCUMENT_TREE為整個SD卡(或相關子目錄)提供App寫權限,如本文中使用SAF(存儲訪問框架)的Android SD卡寫權限中所建議的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM