#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());
}