Подтвердить что ты не робот

ListFiles() возвращает значение null на эмулятор Android 6.0

Я хочу читать jpeg файлы из sdcard на эмуляторе Android 6.0, но список файлов возвращает null. Код примера может работать на моем телефоне:

            String sdcard = Environment.getExternalStorageDirectory().toString();
            File sdcard_dir = new File(sdcard);
            if (sdcard_dir.isDirectory()) {
                File[] fileNames = sdcard_dir.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        return pathname.toString().endsWith(".jpg") ? true : false;
                    }
                });
            }

fileNames = null!

Я могу использовать оболочку adb для отображения файлов изображений на эмуляторе:

введите описание изображения здесь

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

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

Что-нибудь еще я могу сделать?

Мне нужно использовать эмулятор, потому что до сих пор мое устройство не может быть обновлено до Android 6.0, и я хочу протестировать некоторые новые API.

4b9b3361

Ответ 1

Android 6.0 представила разрешения на выполнение. В дополнение к объявлению разрешения на ваш манифест вам необходимо запросить разрешение у пользователя во время выполнения.

Дополнительная информация и руководства здесь: http://developer.android.com/training/permissions/requesting.html

Ответ 2

Я наблюдал точно такую ​​же проблему, даже после добавления кода разрешений времени выполнения, необходимого для Android 6.0.

В моей деятельности у меня есть следующий код:

    int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
    int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                             Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_READWRITE_STORAGE);
    }

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

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions,
                                       int[] grantResults) {
    if (requestCode == REQUEST_READWRITE_STORAGE) {
        if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
            finishCreationStep();
        }
    }
}

Я проверил в отладчике, что разрешения на чтение и запись предоставлены. Тем не менее последующий выполненный вызов для чтения хранилища не выполняется:

File[] possible_files = mrpDir.listFiles();

Вызов listFiles() возвращает значение null. Если я завершаю приложение и перейдите в "Настройки" > "Приложения для моего приложения", я вижу, что разрешение на хранение было предоставлено. Если я также завершаю приложение, а затем снова запустил его, разрешения будут доступны, как и ожидалось, а вызовы listFiles() работают нормально. Таким образом, другими словами, изменение прав доступа не вступает в силу до тех пор, пока приложение не будет завершено и не перезапущено. Есть ли способ заставить приложение распознавать измененные разрешения без необходимости завершать работу пользователя и повторно запускать его вручную?

Как и в случае с создателем этого потока, я запускаю эмулятор API 23, так как в настоящее время у меня нет доступа к устройству Android 6. Поэтому я полагаю, что есть проблема с эмулятором. Но это кажется маловероятным.

Ответ 3

Ваш первый вызов

if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                         Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_READWRITE_STORAGE);
}

- проверить, есть ли у вас разрешение. Если у вас этого нет, вызывается разрешение, обратный вызов. Это первый раз.

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

if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                         Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_READWRITE_STORAGE);
}
else
    finishCreationStep();