Почему я не могу писать на внешнее хранилище Android?

Я пытаюсь написать приложение для Android, которое, помимо прочего, должно читать и записывать файлы во "внешнее" хранилище.

Хотя я могу просматривать и выбирать папку на внешнем хранилище, каждый раз, когда я пытаюсь получить доступ к файлу, я получаю исключение ввода-вывода Permission denied I/O.

Я включил следующие разрешения в манифест моего приложения:

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

Я также включил разрешение на ХРАНЕНИЕ для приложения в Android.

Я разрабатываю на Chromebook, поэтому у меня нет доступа к эмуляторам. Поэтому я тестирую и отлаживаю свое приложение на своем телефоне (Pixel 3) с помощью кабеля USB-C. Я также могу создать APK и загрузить его на свой Chromebook, но я не могу отлаживать таким образом.

Следующий пример кода я собрал в Интернете.

 public void writeFileExternalStorage(View view) {
        String cashback = "Get 2% cashback on all purchases from xyz \n Get 10% cashback on travel from dhhs shop";
        String state = Environment.getExternalStorageState();
        //external storage availability check
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            return;
        }
        File file = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOCUMENTS), filenameExternal);


        FileOutputStream outputStream = null;
        try {
            file.createNewFile();
            //second argument of FileOutputStream constructor indicates whether to append or create new file if one exists
            outputStream = new FileOutputStream(file, true);

            outputStream.write(cashback.getBytes());
            outputStream.flush();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Когда выполняется file.createNewFile(), выдается следующее исключение: java.io.IOException: Permission denied

Я уже два дня бился головой об стену по этому поводу, и это ни к чему не привело. Надеюсь, здесь кто-нибудь поможет, у меня очень болит голова!:-)

2 ответа

Решение

Видимо виноват Android 10.

Я снизил целевой SDK до 28 (Android 9), и код работает.

Похоже, если я хочу, чтобы это работало для Android 10, мне нужно будет использовать MediaStore для SDK 29+.

Вы должны проверить разрешение времени выполнения перед writeFileExternalStorage функция:

private static final int WRITE_EXTERNAL_STORAGE = 0; private static final int REQUEST_PERMISSION = 0;

int permissionCheckStorage = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheckStorage != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_PERMISSION);

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