Съемный путь для хранения (внешний) sdcard производителями
Я работал с Googling, но очень сложно найти, какие производители/модели используют этот путь для SDK/внешнего хранилища.
- Я не говорю о внутреннем пути хранения, который можно найти:
Environment.getExternalStorageDirectory()
Я знаю, что getExternalStorageDirectory()
иногда указывает на внешнюю SD-карту на некоторых устройствах.
Здесь я нашел общий путь для внешнего пути (не уверен, какой производитель использует какой путь):
/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/sdcard/sd
/mnt/sdcard/bpemmctest
/mnt/sdcard/_ExternalSD
/mnt/sdcard-ext
/mnt/Removable/MicroSD
/Removable/MicroSD
/mnt/external1
/mnt/extSdCard
/mnt/extsd
/mnt/usb_storage <-- usb flash mount
/mnt/extSdCard <-- usb flash mount
/mnt/UsbDriveA <-- usb flash mount
/mnt/UsbDriveB <-- usb flash mount
Это то, что я нашел в Googling.
Мне нужно сканировать весь внутренний + внешний накопитель + USB-флеш-накопитель для поиска определенного файла. Если мне не хватает какого-либо пути, добавьте в вышеуказанный список. Если кто-то знает пути, используемые каждым производителем, пожалуйста, поделитесь с нами.
Ответы
Ответ 1
Хорошие новости! В KitKat теперь есть общедоступный API для взаимодействия с этими дополнительными совместно используемыми устройствами хранения.
Новые методы Context.getExternalFilesDirs()
и Context.getExternalCacheDirs()
могут возвращать несколько путей, включая как первичные, так и вторичные устройства. Затем вы можете перебрать их и проверить Environment.getStorageState()
и File.getFreeSpace()
, чтобы определить наилучшее место для хранения ваших файлов. Эти методы также доступны на ContextCompat
в библиотеке support-v4.
Также обратите внимание, что если вы заинтересованы в использовании каталогов, возвращаемых Context
, вам больше не нужны разрешения READ_
или WRITE_EXTERNAL_STORAGE
. В будущем вы всегда будете иметь доступ на чтение/запись к этим каталогам без каких-либо дополнительных разрешений.
Приложения также могут продолжить работу над более старыми устройствами, выполнив их запрос на разрешение следующим образом:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
Ответ 2
Я также начал с списка, подобного вашему, откуда-то (извините, не смог найти исходный источник) и продолжайте добавлять некоторые пути, собранные из отзывов пользователей. В вышеуказанный список дубликаты.
/storage/sdcard1 //!< Motorola Xoom
/storage/extsdcard //!< Samsung SGS3
/storage/sdcard0/external_sdcard // user request
/mnt/extsdcard
/mnt/sdcard/external_sd //!< Samsung galaxy family
/mnt/external_sd
/mnt/media_rw/sdcard1 //!< 4.4.2 on CyanogenMod S3
/removable/microsd //!< Asus transformer prime
/mnt/emmc
/storage/external_SD //!< LG
/storage/ext_sd //!< HTC One Max
/storage/removable/sdcard1 //!< Sony Xperia Z1
/data/sdext
/data/sdext2
/data/sdext3
/data/sdext4
/sdcard1 //Sony Xperia Z
/sdcard2 //HTC One M8s
/storage/microsd //ASUS ZenFone 2
Для того, что вы хотите достичь (сканирование всех возможных путей для определенных файлов), я считаю совершенно невозможным сделать это таким образом (используя список известных путей). Некоторые пути на одном устройстве даже изменились между обновлением Android.
Ответ 3
На основе путей, предоставленных Oceanuz, я написал метод, который находит внешний путь хранения (игнорируя случай) и возвращает его как строку.
Примечание. Я использовал StreamSupport библиотеку внутри моего метода, поэтому, чтобы она работала, вам нужно загрузить банку файл и добавить это в папку libs в вашем проекте и что он.
public static String getExternalSdPath(Context context) {
List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
"sdext1", "sdext2", "sdext3", "sdext4");
final String[] thePath = {""};
Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
.filter(s -> {
File folder = new File(s);
return folder.exists() && folder.isDirectory();
}) //I got the ones that exist and are directories
.flatMap(s -> {
try {
List<File> files = Arrays.asList(new File(s).listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.emptyList());
}
}) //I got all sub-dirs of the main folders
.flatMap(file1 -> {
if (listOf2DepthFolders.contains(file1.getName().toLowerCase())) {
try {
List<File> files = Arrays.asList(file1.listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.singletonList(file1));
}
} else
return StreamSupport.stream(Collections.singletonList(file1));
}) //Here I got all the 2 depth and 3 depth folders
.filter(o -> listOfExtFolders.contains(o.getName().toLowerCase()))
.findFirst();
optional.ifPresent(file -> thePath[0] = file.getAbsolutePath());
Log.i("Path", thePath[0]);
return thePath[0];
}
Этот метод вернет пустую строку, если нет пути к Sd-карте.
Ответ 4
Я пытался найти путь к своей внешней SD-карте на Sony Xperia XA. Затем я установил ES File explorer и четко показал путь к любой папке, внутренней или внешней, в ней окне характеристик. Я нашел путь к внешнему SD как /storage/C 4EE-F3A3. Я пытался сохранить выходной файл с Python3 на внешнюю SD, но у него не было разрешения на сохранение в другом SD-пространстве, кроме папки Qpython.
Ответ 5
Вы пробовали:
Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);
Где тип - это каталог, определенный для android, который вам нужен, например Environment.DIRECTORY_DOWNLOADS, который предоставит вам каталог загрузки
Это не "getExternalStorageDirectory", это "getExternalStoragePublicDirectory". Обратите внимание, что для каждого устройства Android оно вернет место, где происходит хранилище (например:/mnt/external_sd), работающее на моем трансформаторе 101, связке 10 и галактике s2. Мне нужно было загрузить файл в хранилище
Здесь документация http://developer.android.com/reference/android/os/Environment.html