Как получить список файлов в директории? (Android API Level 26)

308
09 ноября 2017, 03:55

Каким образом можно получить список файлов в директории?

Я добавил в AndroidManifest.xml разрешения:

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

Пытаюсь получить список файлов:

File dir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_MUSIC).getPath());
File f = new File(dir.toString());
File[] list = f.listFiles(); // Получаю null, хотя файлы и папки там есть

Сама же директория, при этом, возвращает true на проверки .isDirectory() и .exists().

При попытке сделать то же самое через NIO получаю AccessDeniedException.

Answer 1

Скорее всего вы не запрашиваете разрешения в runtime...

Для запроса разрешений в runtime используйте следующий код:

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // Should we show an explanation?
    if (shouldShowRequestPermissionRationale(
            Manifest.permission.READ_EXTERNAL_STORAGE)) {
        // Explain to the user why we need to read the contacts
    }
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant that should be quite unique
    return;
}

Код для обработки запроса на разрешения:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
        // other 'case' lines to check for other
        // permissions this app might request
    }
}

источник - https://developer.android.com/training/permissions/requesting.html

Важно: До Android 8.0 (API 26), если приложение запрашивало разрешение во время выполнения и разрешение было предоставлено, система также неправильно предоставляла приложению остальные разрешения, принадлежащие той же группе разрешений, которые были зарегистрированы в манифесте.

В Android 8.0, это поведение было исправлено. Приложение получает только разрешения, которые были запрошенны явно. Однако, как только пользователь предоставляет разрешение приложению, все последующие запросы на разрешения, относящиеся к той же группе разрешений, предоставляются автоматически.

READ ALSO
Spring + ReactJS - получить данные с сервера

Spring + ReactJS - получить данные с сервера

На бэке есть Spring-@RestController, который по URL "

278
IP для подключения к сокету

IP для подключения к сокету

Я через android могу подключится к серверу только через 192168

271
Наследник для FileInputStream Java

Наследник для FileInputStream Java

Задача написать класс, который в конструкторе будет принимать имя файла, если файл с расширениемtxt, то создавать объект FileInputStream, если нет...

270
Как получить список всех аудио-файлов? (Android)

Как получить список всех аудио-файлов? (Android)

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

261