Как сохранить файлы в корень SD-карты (Android 8.0+)?

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

Я прошу разрешения WRITE_EXTERNAL_STORAGE, но я думаю, что этого недостаточно для записи на внешнюю SD-карту.

Вот мой код:

private boolean authorized = false;
private final static int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 1;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        long debut = System.currentTimeMillis();
        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            debut = System.currentTimeMillis();
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE);
        } else {
            authorized = true;
        }
        while (!authorized) {
            if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                authorized = true;
            } else if (System.currentTimeMillis() - debut >= 5000) {
                this.finish();
                System.exit(0);
            }
        }

//SDCARD path = "/storage/9016-4EF8"
new File("/storage/9016-4EF8"+"/MyApp").mkdirs();
}

Мой код работает на моем телефоне (Android 5.1), но не на моем планшете (Android 8.1). Похоже, у меня есть разрешение на чтение только в последних версиях Android. Как получить разрешение на запись на SD-карту?

Я использую приложение File Explorer, Xplore, и это приложение, похоже, запрашивает другое разрешение, прежде чем сможет изменять файлы на SD-карте:

"предоставить Xplore доступ к вашим данным, включая фотографии и видео, на SD-карте"

Как я могу запросить это разрешение (если это вообще возможно)?


person Arthur    schedule 07.06.2019    source источник
comment
Как получить разрешение на запись на SD-карту? -- нет, особенно на Android Q и выше. Используйте инфраструктуру доступа к хранилищу (например, ACTION_OPEN_DOCUMENT_TREE) и позвольте пользователю выбирать, куда пойдет содержимое.   -  person CommonsWare    schedule 07.06.2019
comment
Дело в том, что я не хочу, чтобы пользователь мог выбирать, мне нужны мои файлы в фиксированном месте, которое легко найти на SD-карте.   -  person Arthur    schedule 07.06.2019
comment
Нет, друг мой, это плохая практика, и Google больше этого не разрешает. Пользователь должен выбрать папку. Что вы МОЖЕТЕ сделать, так это попросить пользователя (используя диалоговое окно или что-то еще) выбрать корневую папку SD, что даст вам доступ к любому дочернему элементу этой папки, что, конечно же, означает всю SD-карту.   -  person Sotiris S. Magionas    schedule 07.06.2019
comment
Ну, меня попросили сохранить все файлы таким образом. Если я где-нибудь сохраню возвращенный URI, сохранятся ли у меня права на запись?   -  person Arthur    schedule 07.06.2019
comment
Меня попросили сохранить все файлы таким образом — поговорите с тем, кто дал вам это требование, и объясните, что на Android это не работает. Мне нужны мои файлы в фиксированном месте, легко найти на SD-карте — вы можете использовать getExternalFilesDirs(). Если это возвращает 2+ местоположения, все, кроме первого, будут на съемном носителе. Однако это не будет корнем съемного носителя. Если я где-нибудь сохраню возвращенный URI, сохранятся ли у меня права на запись? -- вы можете использовать takePersistableUriPermissions() на ContentResolver для Uri, который вы получаете от Storage Access Framework.   -  person CommonsWare    schedule 07.06.2019


Ответы (1)