Съемный накопитель (внешний) путь sdcard по производителям

Я гуглил, но оооочень трудно определить, какие производители / модели используют какой путь для SDCard/ внешнего хранилища.

  • Я НЕ говорю о внутреннем пути хранения, который можно найти с помощью:

Environment.getExternalStorageDirectory()

я знаю это getExternalStorageDirectory() иногда указывает на внешнюю SDCard на некоторых устройствах.

Вот что я нашел некоторый общий путь для внешнего пути (не уверен, какой производитель использует какой путь):

/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

Это то, что я нашел в Google.

Мне нужно сканировать весь внутренний + внешний накопитель + USB-накопитель, чтобы найти определенный файл. Если я пропустил какой-либо путь, пожалуйста, добавьте в приведенный выше список. Если кто-то знает пути, используемые каждым из производителей, пожалуйста, поделитесь с нами.

5 ответов

Решение

Хорошие новости! В KitKat теперь есть открытый API для взаимодействия с этими вторичными общими устройствами хранения.

Новый Context.getExternalFilesDirs() а также Context.getExternalCacheDirs() методы могут возвращать несколько путей, включая как первичные, так и вторичные устройства. Затем вы можете перебрать их и проверить Environment.getStorageState() а также File.getFreeSpace() определить лучшее место для хранения ваших файлов. Эти методы также доступны на ContextCompat в библиотеке поддержки-v4.

Также обратите внимание, что если вы заинтересованы только в использовании каталогов, возвращаемых Contextвам больше не нужно READ_ или же WRITE_EXTERNAL_STORAGE разрешения. В дальнейшем у вас всегда будет доступ на чтение / запись к этим каталогам без дополнительных разрешений.

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

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

Я также начал со списка, подобного вашему, откуда-то (извините, не смог найти исходный источник) и продолжаю добавлять некоторые пути, собранные из отзывов пользователей. Есть дубликаты в приведенном выше списке.

    /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.

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

Примечание: я использовал библиотеку StreamSupport в своем методе, поэтому, чтобы она работала, вам нужно скачать файл jar и добавить его в папку 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 Card.

Я пытался найти путь к моей внешней SD-карте в Sony Xperia XA. Затем я установил ES File Explorer, и он ясно показал путь к любой папке, внутренней или внешней, в ее окне характеристик. Я нашел путь к внешнему SD как /storage/C4EE-F3A3. Я пытался сохранить выходной файл из Python3 на внешнюю SD, но у него не было разрешения на сохранение где-либо, кроме папки Qpython на внутренней SD.

Ты пытался:

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

Другие вопросы по тегам