Почему я не могу писать на внешнее хранилище 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;
}