簡體   English   中英

無法寫入具有權限的SD卡

[英]Can't write to SD Card with permissions

我一直在努力地在SD卡上寫東西,最后我終於意識到,這項工作有一種新的“權限”。 首先,這是我使用的代碼,希望獲得許可,以后不再需要它:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, RCODE);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RCODE && resultCode == Activity.RESULT_OK){
        Uri treeUri = data.getData();
        DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
        grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        App.editor.putBoolean("writable",true).apply();App.editor.commit();
    }
}

這是我用來刪除文件的代碼:

public static boolean deleteFile(Context context, File f){
    if (isOnInternal(f)){
        return f.delete();
    }else{
        String path = "/document/";
        String tp = f.getAbsolutePath().replace(getsdpath(),"").substring(1);
        path += getsdpath().replace("/storage/","")+":"+tp;
        Uri uri = new Uri.Builder()
                .scheme("content")
                .authority("com.android.externalstorage.documents")
                .path(path)
                .build();
        Log.e("path1",uri.getPath());
        return DocumentFile.fromSingleUri(context,uri).delete();
    }
}

這是我要刪除文件時的LogCat消息:

W/Documents: Failed to delete document
java.lang.SecurityException: Permission Denial: writing com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/document/1CE2-0E0E%3Aimg.jpg from pid=3000, uid=10060 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
    at android.os.Parcel.readException(Parcel.java:1599)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
    at android.content.ContentProviderProxy.call(ContentProviderNative.java:646)
    at android.content.ContentProviderClient.call(ContentProviderClient.java:437)
    at android.provider.DocumentsContract.deleteDocument(DocumentsContract.java:1015)
    at android.provider.DocumentsContract.deleteDocument(DocumentsContract.java:999)
    at android.support.v4.provider.SingleDocumentFile.delete(SingleDocumentFile.java:98)
    at ir.coders.nahan.Utils.FileUtils.deleteFile(FileUtils.java:41)
    at ir.coders.nahan.App.deleteFile(App.java:314)
    at ir.coders.nahan.Activities.HidePics.lambda$onActivityResult$7(HidePics.java:230)
    at ir.coders.nahan.Activities.-$$Lambda$HidePics$Vwwkfk8tS-KV0NE8pJgYHtkKXnI.run(lambda)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

這是以下方法采取的兩條路徑:

uri.getPath();
the tree which I grant the permission from: /tree/1CE2-0E0E:
the file : /document/1CE2-0E0E:img.jpg

我用來刪除文件的代碼是嘗試在用戶選擇文件時復制android itslef的原始URI,但它似乎並未按計划工作。

我將不勝感激!

通過清單或代碼將MANAGE_DOCUMENTS添加到您的權限中。 您的其他權限似乎並不涵蓋此特定權限。

我從/ tree / 1CE2-0E0E授予許可的樹:

文件:/document/1CE2-0E0E:img.jpg

URI的根不同。 檢查這兩個URI,因為它們看起來不一樣。 我懷疑這就是問題所在。

您應該以某種方式重新使用發送給grantUriPermission()的URI

暫無
暫無

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

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