Не могу записать на SD-карту на Android

У меня проблема с записью на SD-карту на моем устройстве Android 4.4. Я пишу приложение, которое получает путь к своему каталогу на SD-карте с помощью метода getExternalFilesDirs(). Но когда я пытаюсь сохранить данные в каталоге, я получаю сообщение об ошибке:

EACCES (Permisson denied)

Каталоги приложений в Android/data/ во внутренней памяти и на SD-карте принадлежат разным пользователям Linux. Любое другое приложение на моем устройстве работает нормально. Приложение работает на другом устройстве с этой SD-картой.

3 ответа

Использовать getExternalFilesDir()

Он возвращает путь к папке с файлами внутри Android/data/data/your_package/ на вторичной карте памяти SD. Он используется для хранения любых необходимых файлов для вашего приложения (например, изображений, загруженных из Интернета или файлов кэша). После удаления приложения все данные, хранящиеся в этой папке, также исчезают.

Здесь вы можете записать файл во вторичное хранилище, т. Е. (Ваш микро SDCard)

если вы хотите писать вне или в корень вторичного хранилища, вы должны использовать среду доступа к хранилищу.

Вам необходимо добавить это разрешение в AndroidManifest.xml:

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

Я думаю, что вы ошиблись этой линией. Дважды проверьте эту строку

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

где вы положили эту строку?

эта линия должна быть за пределами <application/> объем

как это

<manifest>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        ...
        <application>
            ...
            <activity> 
                ...
            </activity>
        </application>
    </manifest>

Чтобы getExternalFilesDirs возвращал путь SD-карты, OEM-производитель должен установить переменную среды SECONDARY_STORAGE в файле init.rc для конкретного устройства, как указано здесь: https://source.android.com/devices/storage/config-example.html

Посмотрите на источник getExternalFilesDirs здесь: http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/app/ContextImpl.java#1039

Значение получается из Environment.buildExternalStorageAppFilesDirs. Посмотрите на этот источник здесь: http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/os/Environment.java#206

Это значение зависит от mExternalDirsForApp, который, в свою очередь, заполняется чтением содержимого переменной SECONDARY_STORAGE: http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/os/Environment.java#136

Как вы можете видеть, если переменная SECONDARY_STORAGE не установлена, путь SDCard не будет возвращен. Вы можете перепроверить это, перейдя в оболочку adb и посмотрев вывод echo $SECONDARY_STORAGE

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