簡體   English   中英

如何從可移動SD卡(第二外部存儲)中刪除文件?

[英]How to delete file from removable sd card (second external storage)?

我試圖從我的SD卡(可移動)刪除android 9上的文件(PATH_TO_SD_CARD / DCIM / 1.PDF)。

1.我得到了第二個是我的SD卡的volumePaths。

private static String[] getVolumePaths(Context context) {
    String[] volumes = null;
    StorageManager managerStorage = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
    if (managerStorage == null) {
        return volumes;
    }
    try {
        return (String[]) managerStorage.getClass().getMethod("getVolumePaths", new Class[0]).invoke(managerStorage, new Object[0]);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
        return volumes;
    } catch (IllegalArgumentException e2) {
        e2.printStackTrace();
        return volumes;
    } catch (IllegalAccessException e3) {
        e3.printStackTrace();
        return volumes;
    } catch (InvocationTargetException e4) {
        e4.printStackTrace();
        return volumes;
    }
}

    String[] volumePaths = getVolumePaths(getContext());
    Log.v("VOLUME1: ", "-> "+volumePaths[0]);
    Log.v("VOLUME2: ", "-> "+volumePaths[1]);

LocCat:

2019-07-19 17:06:15.577 13257-13257/com.spicysoftware.spicypdfreader V/VOLUME2:: -> /storage/2585-1513

2.檢查文件是否存在,返回true

Log.v("FILE EXISTS?", "-> "+new File("/storage/2585-1513/DCIM/1.PDF").exists());

logcat的

2019-07-19 17:06:16.577 13257-13257/com.spicysoftware.spicypdfreader V/FILE EXISTS? -> true

3.1我正在嘗試刪除該文件

但這種方式不起作用,為什么呢?

new File("/storage/2585-1513/DCIM/1.PDF").delete();

3.2我試圖通過DOCUMENT_FILE_TREE刪除文件

// call for document tree dialog
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 123);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case 123:
            if (resultCode == Activity.RESULT_OK) {
                String strFilePath = data.getData().getPath()+"/DCIM/1.PDF";
                try {
                    if(new File(strFilePath).delete()){
                        Log.v("FILE", "DELETED");
                    }else{
                        Log.v("FILE", "NOT DELETED");
                    }
                }catch (Exception e){
                    Log.v("ERROR: ", "-> "+e);
                }
            }
            break;
    }
}

logcat的

2019-07-19 17:23:20.523 14343-14343/com.spicysoftware.spicypdfreader V/FILE: NOT DELETED

所以我的問題是:如何從可移動SD卡(第二外部存儲)中刪除文件? 這太奇怪了...我在這個問題上已經2天了,並且沒有找到任何解決方案如何刪除此SD卡上的文件...

我還使用了無效的存儲訪問框架。 如果它是處理的唯一方法請添加一個例子。

如何從可移動SD卡(第二外部存儲)中刪除文件?

你沒有。 您沒有對可移動存儲上的任意位置的讀/寫訪問權限。

我還使用了無效的存儲訪問框架

並不是的。 您使用ACTION_OPEN_DOCUMENT_TREE獲取Uri ,然后嘗試將其轉換為File 這不起作用,因為Uri不是文件。

最簡單的解決方案是:

  • 使用ACTION_OPEN_DOCUMENT

  • 傳遞你得到的Uri data.getData()你的問題中的data.getData() )並將其傳遞給DocumentFile.fromSingleUri()

  • DocumentFile上調用delete()

通過安全性,您可以訪問SD卡,但只能將文件寫入和讀取為應用程序創建的目錄或應用程序創建的目錄中的文件 (使用WRITE_EXTERNAL_STORAGE權限)。

在此輸入圖像描述

例如,如果您的外部存儲路徑是

/storage/13257-13257/

您的應用包名稱是com.spicysoftware.spicypdfreader

您可以訪問和刪除在此路徑中創建的文件:

 /storage/13257-13257/com.spicysoftware.spicypdfreader

順便提一句,我建議您使用ContextCompat.getExternalFilesDirs(context, null)來獲取/ files目錄/storage/13257-13257/com.spicysoftware.spicypdfreader/files的路徑。

例:

 File[] storages = ContextCompat.getExternalFilesDirs(context, null);
Log.i(TAG, "storage[0]: " + storages[0]);
Log.i(TAG, "storage[1]: " + storages[1]);

總之,你可以在這里刪除文件:

new File("/storage/13257-13257/com.spicysoftware.spicypdfreader/files/1.PDF").delete();

或者這里(外部/files目錄):

new File("/storage/13257-13257/com.spicysoftware.spicypdfreader/1.PDF").delete();

但是不可能這樣做:

new File("/storage/13257-13257/DCIM/1.PDF").delete();

暫無
暫無

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

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