Статьи

Android: поиск пути к SD-карте

Найти путь SD-карты в Android легко, правда? Все, что вам нужно сделать, это использовать Environment.getExternalStoreDirectory () , и все готово!

Ну, не совсем.

В конце концов, это то, что говорит StackOverflow . Если вы на самом деле попробуете описанный выше метод на устройстве Samsung, жизнь вам не понравится. Environment.getExternalStoreDirectory () фактически возвращает неверный путь на большинстве устройств Samsung. Вот так я и наткнулся на проблему. Оказывается, вышеприведенный метод на самом деле не гарантирует, что он вернет каталог SD Card. Согласно документации Android API,

«В устройствах с несколькими« внешними »каталогами хранения (такими как безопасное хранилище приложений и монтируемое общее хранилище) этот каталог представляет собой« первичное »внешнее хранилище, с которым пользователь будет взаимодействовать».

Таким образом, вызов не гарантирует, что путь вернул истинно указывает SD-карту. Есть несколько других способов получить «внешний» путь на устройстве, где могут храниться файлы, например, getExternalFilesDir () .

Есть также несколько других приемов, позволяющих получить путь к каталогу SD-карты. Приведенный ниже код работает на большинстве устройств Android (включая Samsung). Это довольно хакерское решение, и кто знает, как долго этот трюк будет работать ( источник ). Вместо использования приведенного ниже кода, возможно, лучше задать вопрос: «Мне действительно нужен каталог SD-карты или просто путь, по которому я могу хранить файлы?»

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
File file = new File("/system/etc/vold.fstab");
    FileReader fr = null;
    BufferedReader br = null;
    
    try {
        fr = new FileReader(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    
    try {
        if (fr != null) {
            br = new BufferedReader(fr);
            String s = br.readLine();
            while (s != null) {
                if (s.startsWith("dev_mount")) {
                    String[] tokens = s.split("\\s");
                    path = tokens[2]; //mount_point
                    if (!Environment.getExternalStorageDirectory().getAbsolutePath().equals(path)) {
                        break;
                    }
                }
                s = br.readLine();
            }
        }           
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fr != null) {
                fr.close();
            }           
            if (br != null) {
                br.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Приятного кодирования и не забудьте поделиться!

Ссылка: руководство для Android: поиск пути к SD-карте от нашего партнера по JCG Исаака Тейлора в блоге Programming Mobile