Невозможно создать папку во внутренней памяти Android - PullRequest
2 голосов
/ 27 октября 2019

Я пытаюсь создать папку во внутренней памяти телефона, но она просто не создает ее независимо от того, что я делаю

То, что я пробовал:

  • отключение телефона от компьютера

  • установка разрешений как в манифесте, так и программно для API 23 +

  • для каждого вариантаполучение папки, которую я могу найти: Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) Environment.getDataDirectory () и т. д. 1020 *

  • пробовал оба варианта mkdir () и mkdirs ()

  • проверял телефон, если папка существует

Этот кодтакже привязан к кнопке, поэтому запрос разрешения уже должен быть предоставлен во второй раз, когда я нажимаю ее.

File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");

String[] PERMISSIONS_STORAGE = {
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, 1);

System.out.println("DIRECTORY CREATED: " + sdir.mkdirs());
System.out.println("EXISTS: " + sdir.exists());
System.out: DIRECTORY CREATED: false
System.out: EXISTS: false
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.testM">

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

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Это ограничение конфиденциальности, введенное в Android-Q. Прямой доступ к общим / внешним устройствам хранения считается устаревшим, когда приложение предназначено для API 29, а путь, возвращаемый методом getExternalStorageDirectory , больше не доступен напрямую для приложений. Используйте каталог для приложения для записи и чтения файлов.

По умолчанию приложениям, ориентированным на Android 10 и выше, предоставляется доступ к области во внешнее хранилище или хранилище с областью действия. Такие приложения могут видеть следующие типы файлов на внешнем устройстве хранения данных без необходимости запрашивать какие-либо разрешения пользователя, связанные с хранением:

0 голосов
/ 27 октября 2019

Попробуйте изменить эту строку:

File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");

на

File sdir = new File (Environment.getExternalFilesDir(null) + "/DBTEST/");

Согласно документации разработчика:

getExternalStorageDirectory () - Этот метод устарел на уровне API 29. Для улучшения конфиденциальности пользователей прямой доступ к общим / внешним устройствам хранения не рекомендуется. Когда приложение предназначается для Build.VERSION_CODES.Q, путь, возвращаемый этим методом, больше не доступен напрямую для приложений. Приложения могут продолжать получать доступ к содержимому, хранящемуся в общем / внешнем хранилище, путем перехода на альтернативные варианты, такие как Context # getExternalFilesDir (String), MediaStore или Intent # ACTION_OPEN_DOCUMENT.

getExternalFilesDir(null) вернет папку хранения ваших приложений по адресу (Внутреннее хранилище) /Android/data/your.app.name/file/

Если вы хотите получить доступ к определенной операционной системе, определеннойпапки, которые вы просто передаете константы среды, определенные здесь:

https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)

и здесь

https://developer.android.com/reference/android/os/Environment

в разделе «Поля».

Отл. загрузка будет: getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...