如何从可移动SD卡(第二外部存储)中删除文件?

时间:2019-07-19 15:27:39

标签: android delete-file

我正在尝试从我的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卡上的文件...

我还使用了不起作用的存储访问框架。 如果这是唯一的处理方法,请添加示例。

2 个答案:

答案 0 :(得分:1)

出于安全考虑,您可以访问SD卡,但您只能将文件写入或读取到为应用程序创建的目录中,或者将文件写入应用程序创建的目录中(使用{{ 1}}权限。)

enter image description here

例如,如果您的外部存储路径为

WRITE_EXTERNAL_STORAGE

,您的应用包名称为/storage/13257-13257/

您可以访问和删除在此路径内创建的文件:

com.spicysoftware.spicypdfreader

通过我建议您使用 /storage/13257-13257/com.spicysoftware.spicypdfreader 来获取/ files目录ContextCompat.getExternalFilesDirs(context, null)的路径

示例:

/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();

答案 1 :(得分:0)

  

如何从可移动SD卡(第二个外部存储设备)中删除文件?

你不知道。您没有对可移动存储设备上任意位置的读/写访问权限。

  

我还使用了不起作用的存储访问框架

不是。您使用ACTION_OPEN_DOCUMENT_TREE来获取Uri,然后尝试将其变成File。这将不起作用,因为Uri不是文件。

最简单的解决方案是:

  • 使用ACTION_OPEN_DOCUMENT

  • 将您得到的Uri(从问题中获取data.getData())传递给DocumentFile.fromSingleUri()

  • 在该delete()上呼叫DocumentFile