Съемный путь для хранения (внешний) 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