Как получить внутренний и внешний путь (sdcard) с помощью getExternalFilesDirs?

#java #android #android-sdcard #android-external-storage #android-storage

#java #Android #android-sdcard #android-external-storage #android-хранилище

Вопрос:

Я пытаюсь получить пути к моему внутреннему хранилищу и моему внешнему хранилищу (съемная SD-карта).

Что я пробовал, так это:

Внутренний путь

 path = getActivity().getExternalFilesDirs(null)[0].getAbsolutePath();
  

Внешний путь

 path = getActivity().getExternalFilesDirs(null)[1].getAbsolutePath();
  

Logcat

Внутренний путь возвращает:

 /storage/emulated/0/Android/data/com.package./files
  

И с помощью SubString мне удалось перейти к этому пути

 /storage/emulated/0/
  

Код подстроки

 int index = path.lastIndexOf("/Android/data/");
if (index > 0){
path =  path.substring(0, index);
Log.d(TAG, "value path0: "   path);
}
  

Для внешнего пути я проделал то же самое с SubString, и он возвращает

 /storage/3EC7-2342
  

Теперь я не уверен, что это нормально для жесткого кодирования строки «/ Android / data /», потому что я не уверен, что все устройства имеют эту строку в своем path, и это может работать на моем устройстве, но, возможно, не на других.

Есть ли другой способ получить абсолютный путь из внутреннего и внешнего хранилища (sdcard)?

 getActivity().getExternalFilesDirs(null)[0].getAbsolutePath();
  

Значение пути Logcat при использовании кода выше.

 /storage/emulated/0/Android/data/com.package./files
  

Он всегда возвращает слишком длинный путь, мне нужно добраться до корня внутренней и внешней памяти.

Ответ №1:

Я думаю, вам не нужен код подстроки. Вы можете использовать это. следующее относится к внешнему пути, как вы указали.

 File file1 =  getApplicationContext().getExternalFilesDirs(null)[1];
    while(!file1.getParentFile().getAbsolutePath().equals("/storage")) {

        file1 = file1.getParentFile();
        System.out.println(file1.getAbsolutePath());
    }
  

Вы можете использовать аналогично для внутреннего пути.

С другой стороны, если в будущем «хранилище» также изменится, то следующий код должен работать.

 String path = null;
    File file1 =  getApplicationContext().getExternalFilesDirs(null)[1];
    while(!file1.getParentFile().getAbsolutePath().equals("/")) {

        file1 = file1.getParentFile();
        path = file1.getAbsolutePath();
        //System.out.println(file1.getAbsolutePath());
    }
    file1 =  getApplicationContext().getExternalFilesDirs(null)[1];
    while(!file1.getParentFile().getAbsolutePath().equals(path)) {

        file1 = file1.getParentFile();
        System.out.println(file1.getAbsolutePath());
    }
  

Ответ №2:

Согласно документации getExternalFilesDirs, я думаю, можно предположить, что после root всегда будет папка ‘Android’.

             //List of the storages
            List<File> storage = new ArrayList<>();
            File[] files = ContextCompat.getExternalFilesDirs(this, null);
            for (File file : files) {

                File parent = file.getParentFile();
                while (parent != null amp;amp; !parent.getPath().endsWith(File.separator   "Android")) {

                    parent = parent.getParentFile();
                }
                if (parent!=null) // add to the list
                    storage.add(parent.getParentFile());
            }