Как получить все пути к файлам и имена из сменного пути SD-карты? - PullRequest
0 голосов
/ 09 марта 2019

Пытаясь получить все пути и имена файлов со съемной SD-карты, я получаю путь SD-карты, например "/ storage / BBF8-A8D3".Теперь от имени этого пути я хочу пойти глубже и поискать файлы, и если есть подкаталоги, перейдите к ним и найдите файлы в этих подкаталогах.

Это дает мне путь SDCard

 @TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static List<String> getSdCardPaths(final Context context, final boolean includePrimaryExternalStorage) {
    final File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);
    if (externalCacheDirs == null || externalCacheDirs.length == 0)
        return null;
    if (externalCacheDirs.length == 1) {
        if (externalCacheDirs[0] == null)
            return null;
        final String storageState = EnvironmentCompat.getStorageState(externalCacheDirs[0]);
        if (!Environment.MEDIA_MOUNTED.equals(storageState))
            return null;
        if (!includePrimaryExternalStorage && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && Environment.isExternalStorageEmulated())
            return null;
    }
    final List<String> result = new ArrayList<>();
    if (includePrimaryExternalStorage || externalCacheDirs.length == 1)
        result.add(getRootOfInnerSdCardFolder(externalCacheDirs[0]));
    for (int i = 1; i < externalCacheDirs.length; ++i) {
        final File file = externalCacheDirs[i];
        if (file == null)
            continue;
        final String storageState = EnvironmentCompat.getStorageState(file);
        if (Environment.MEDIA_MOUNTED.equals(storageState))
            result.add(getRootOfInnerSdCardFolder(externalCacheDirs[i]));
    }
    if (result.isEmpty())
        return null;
    return result;
}

/**
 * Given any file/folder inside an sd card, this will return the path of the sd card
 */
private static String getRootOfInnerSdCardFolder(File file) {
    if (file == null)
        return null;
    final long totalSpace = file.getTotalSpace();
    while (true) {
        final File parentFile = file.getParentFile();
        if (parentFile == null || parentFile.getTotalSpace() != totalSpace)
            return file.getAbsolutePath();
        file = parentFile;
    }
}

Затем для рекурсивного поиска файлов, но застрять

 public void recursiveFunction(File dirPath) {

    File f = new File(String.valueOf(dirPath));
     filesarray = f.listFiles();

     try {
         for (int i = 0; i < filesarray.length; i++) {
             if (filesarray[i].isFile()) {
                 int mid = filesarray[i].getName().lastIndexOf(".");
                 //    String ext=filesarray[i].getName().substring(mid+1,filesarray[i].getName().length());
                 FilesNamez.add(filesarray[i].getName());
                 FilesPathz.add(filesarray[i].getAbsolutePath());

             } else
                 recursiveFunction(filesarray[i].getAbsoluteFile());
         }
     }
     catch (Exception ex){}
}
...