I am having a very weird problem with storage accessing on some devices. The app works on my testing devices (Nexus 4 & 7, Samsung GS5). All my devices running Android 4.4.2. But I received many emails from users saying that the app can not write to the storage (neither the internal storage nor the sd card). From the log file received from user feedback, I can see the problem is the following code:
try {
if (fStream == null) {
fStream = new FileOutputStream(filename, true);
}
fStream.write(data, 0, bytes);
return;
} catch (IOException ex) {
ex.printStackTrace();
}
It throws exception at the line fStream = new FileOutputStream(filename, true); when creating FileOutputStream.
The stack log is:
W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147): at myapp.save(SourceFile:515)
W/System.err( 8147): ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147): at libcore.io.Posix.open(Native Method)
W/System.err( 8147): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147): ... 11 more
In the AndroidManifest.xml I have the following permissions declared:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
I’ve confirmed that the users are using the correct app’s private on the SD card. And what’s more weird is that it fails to write to internal storage as well. How can this happen if I have both read & write permissions? The users say they are not connecting their devices to the PC at that time.
Update
It turns out I am calling open and close FileOutputStream too frequently, which throws the FileNotFoundException at some point. Sounds more like a threading issue.
I am having a very weird problem with storage accessing on some devices. The app works on my testing devices (Nexus 4 & 7, Samsung GS5). All my devices running Android 4.4.2. But I received many emails from users saying that the app can not write to the storage (neither the internal storage nor the sd card). From the log file received from user feedback, I can see the problem is the following code:
try {
if (fStream == null) {
fStream = new FileOutputStream(filename, true);
}
fStream.write(data, 0, bytes);
return;
} catch (IOException ex) {
ex.printStackTrace();
}
It throws exception at the line fStream = new FileOutputStream(filename, true); when creating FileOutputStream.
The stack log is:
W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147): at myapp.save(SourceFile:515)
W/System.err( 8147): ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147): at libcore.io.Posix.open(Native Method)
W/System.err( 8147): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147): ... 11 more
In the AndroidManifest.xml I have the following permissions declared:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
I’ve confirmed that the users are using the correct app’s private on the SD card. And what’s more weird is that it fails to write to internal storage as well. How can this happen if I have both read & write permissions? The users say they are not connecting their devices to the PC at that time.
Update
It turns out I am calling open and close FileOutputStream too frequently, which throws the FileNotFoundException at some point. Sounds more like a threading issue.
I am having a very weird problem with storage accessing on some devices. The app works on my testing devices (Nexus 4 & 7, Samsung GS5). All my devices running Android 4.4.2. But I received many emails from users saying that the app can not write to the storage (neither the internal storage nor the sd card). From the log file received from user feedback, I can see the problem is the following code:
try {
if (fStream == null) {
fStream = new FileOutputStream(filename, true);
}
fStream.write(data, 0, bytes);
return;
} catch (IOException ex) {
ex.printStackTrace();
}
It throws exception at the line fStream = new FileOutputStream(filename, true); when creating FileOutputStream.
The stack log is:
W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147): at myapp.save(SourceFile:515)
W/System.err( 8147): ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147): at libcore.io.Posix.open(Native Method)
W/System.err( 8147): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147): ... 11 more
In the AndroidManifest.xml I have the following permissions declared:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
I’ve confirmed that the users are using the correct app’s private on the SD card. And what’s more weird is that it fails to write to internal storage as well. How can this happen if I have both read & write permissions? The users say they are not connecting their devices to the PC at that time.
Update
It turns out I am calling open and close FileOutputStream too frequently, which throws the FileNotFoundException at some point. Sounds more like a threading issue.
Exception open failed: EACCES (Permission denied) on Android
Google has a new feature on Android Q: filtered view for external storage. A quick fix for that is to add this code in the AndroidManifest.xml file:
<manifest ... >
<!-- This attribute is false by default on apps targeting Android Q. -->
<application android_requestLegacyExternalStorage=true ... >
...
</application>
</manifest>
You can read more about it here: https://developer.android.com/training/data-storage/use-cases
Edit: I am starting to get downvotes because this answer is out of date for Android 11. So whoever sees this answer please go to the link above and read the instructions.
For API 23+ you need to request the read/write permissions even if they are already in your manifest.
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
/**
* Checks if the app has permission to write to device storage
*
* If the app does not has permission then the user will be prompted to grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We dont have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
AndroidManifest.xml
<uses-permission android_name=android.permission.READ_EXTERNAL_STORAGE />
<uses-permission android_name=android.permission.WRITE_EXTERNAL_STORAGE />
For official documentation about requesting permissions for API 23+, check https://developer.android.com/training/permissions/requesting.html
Exception open failed: EACCES (Permission denied) on Android
I had the same problem… The <uses-permission
was in the wrong place. This is right:
<manifest>
<uses-permission android_name=android.permission.WRITE_EXTERNAL_STORAGE/>
...
<application>
...
<activity>
...
</activity>
</application>
</manifest>
The uses-permission
tag needs to be outside the application
tag.
Related posts on Android :
- android – Programmatically Restart a React Native App
- android – What does adb forward tcp:8080 tcp:8080 command do?
- android – File.createTempFile() VS new File()
- Kotlin-allopen for android
- How to import Action Bar Sherlock? android studio
- animation – Android – how to get android.R.anim.slide_in_right
- android – Set notifyDataSetChanged() on Recyclerview adapter
- adb – Android: adbd cannot run as root in production builds
Environment info
System:
OS: Linux 4.15 Ubuntu 18.04.3 LTS (Bionic Beaver)
CPU: (8) x64 Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
Memory: 2.16 GB / 61.90 GB
Shell: 5.4.2 - /bin/zsh
Binaries:
Node: 13.2.0 - ~/.nvm/versions/node/v13.2.0/bin/node
Yarn: 1.19.1 - /usr/bin/yarn
npm: 6.13.1 - ~/.nvm/versions/node/v13.2.0/bin/npm
SDKs:
Android SDK:
API Levels: 23, 26, 28, 29
Build Tools: 23.0.1, 25.0.0, 28.0.3, 29.0.0, 29.0.2
System Images: android-28 | Google APIs Intel x86 Atom_64, android-29 | Intel x86 Atom, android-29 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom_64
npmPackages:
react: 16.9.0 => 16.9.0
react-native: 0.61.4 => 0.61.4
Library version:
1.1.0
Steps To Reproduce
ImagePicker.launchImageLibrary( { title: "Select QR Code", storageOptions: { skipBackup: true, path: "images", }, mediaType: "photo", }, response => { console.log("Response = ", response) if (response.didCancel) { console.log("User cancelled image picker") } else if (response.error) { console.log("ImagePicker Error: ", response.error) Alert.alert("Error", response.error) } else { // process image here } }, )
The system permission dialogue is prompted and accepted. The proper permissions are without certain given. The app has the following in AndroidManifest:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
But despite this the library returns a permission denied error every time like this:
/storage/emulated/0/DCIM/Camera/IMG_20191125_203629.jpg: open failed: EACCES (Permission denied)
Note: everything works as expected in the simulator but the permission error happens on a real device.
The simulator is running Android 28 and device is running Android 29 — is this an issue in the latest Android API version?
я осознаю
открыть не удалось:
EACCES (Permission denied)
на линии OutputStream myOutput = new FileOutputStream(outFileName);
Я проверил рут, и попробовал android.permission.WRITE_EXTERNAL_STORAGE
.
Как я могу исправить эту проблему?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
30 ответы
Для API 23+ вам необходимо запросить разрешения на чтение / запись, даже если они уже есть в вашем манифесте.
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
/**
* Checks if the app has permission to write to device storage
*
* If the app does not has permission then the user will be prompted to grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Официальную документацию о запросе разрешений для API 23+ см. https://developer.android.com/training/permissions/requesting.html
ответ дан 24 окт ’16, 05:10
У Google есть новая функция Android Q: просмотр с фильтром для внешнего хранилища. А быстрая починка для этого нужно добавить этот код в файл AndroidManifest.xml:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting Android Q. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
Вы можете прочитать больше об этом здесь: https://developer.android.com/training/data-storage/use-cases
Редактировать: Я начинаю получать отрицательные голоса, потому что этот ответ устарел для Android 11. Так что, кто бы ни увидел этот ответ, перейдите по ссылке выше и прочтите инструкции.
Создан 17 ноя.
У меня была такая же проблема … <uses-permission
оказался не в том месте. Это правильно:
<manifest>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
<application>
...
<activity>
...
</activity>
</application>
</manifest>
Компания uses-permission
тег должен находиться за пределами application
тег.
ответ дан 03 окт ’16, 21:10
Добавить android: requestLegacyExternalStorage = «true» в Android Manifest Работает с Android 10 (Q) в SDK 29+
или после миграции Андроид Х.
<application
android:name=".MyApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon=""
android:label=""
android:largeHeap="true"
android:supportsRtl=""
android:theme=""
android:requestLegacyExternalStorage="true">
ответ дан 10 дек ’19, 11:12
Я наблюдал это однажды, когда запускал приложение внутри эмулятора. В настройках эмулятора нужно правильно указать размер внешнего хранилища («SD Card»). По умолчанию поле «внешнее хранилище» пусто, и это, вероятно, означает, что такого устройства нет и EACCES выдается, даже если разрешения предоставлены в манифесте.
Создан 30 ноя.
В дополнение ко всем ответам убедитесь, что вы не используете свой телефон в качестве USB-накопителя.
У меня была такая же проблема с HTC Sensation при включенном режиме USB-накопителя. Я все еще могу отлаживать / запускать приложение, но не могу сохранить его во внешнем хранилище.
Создан 30 ноя.
Моя проблема была с «TargetApi (23)», которая необходима, если ваша minSdkVersion ниже 23.
Итак, у меня есть запрос на разрешение со следующим фрагментом
protected boolean shouldAskPermissions() {
return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}
@TargetApi(23)
protected void askPermissions() {
String[] permissions = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"
};
int requestCode = 200;
requestPermissions(permissions, requestCode);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
if (shouldAskPermissions()) {
askPermissions();
}
}
ответ дан 27 окт ’16, 07:10
Имейте в виду, что решение:
<application ...
android:requestLegacyExternalStorage="true" ... >
Является временным, рано или поздно ваше приложение нужно будет перенести для использования Scoped Storage
.
В Android 10 вы можете использовать предложенное решение для обхода системных ограничений, но в Android 11 (R) it is mandatory to use scoped storage
, и ваше приложение может сломаться, если вы продолжите использовать старую логику!
Это видео может быть хорошим подспорьем.
Создан 23 июн.
Я испытываю то же самое. Я обнаружил, что если вы перейдете к Настройки -> Диспетчер приложений -> Ваше приложение -> Разрешения -> Включить хранилище, это решает проблему.
Создан 08 фев.
Android 10 (API 29) представляет хранилище с ограниченным объемом. Изменение манифеста для запроса устаревшего хранилища не является долгосрочным решением.
Я исправил проблему, когда заменил свои предыдущие экземпляры Environment.getExternalStorageDirectory()
(который устарел с API 29) с context.getExternalFilesDir(null)
.
Обратите внимание, что context.getExternalFilesDir(type)
может вернуть null, если место хранения недоступно, поэтому обязательно проверяйте это всякий раз, когда проверяете, есть ли у вас внешние разрешения.
Подробнее здесь.
ответ дан 24 апр.
Оказалось, это была глупая ошибка, поскольку мой телефон все еще был подключен к настольному ПК, и я не осознавал этого.
Поэтому мне пришлось отключить USB-соединение, и все заработало.
Создан 30 ноя.
У меня была такая же проблема на Samsung Galaxy Note 3, работающем под управлением CM 12.1. Проблема для меня заключалась в том, что у меня
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
и должен был использовать его для съемки и хранения пользовательских фотографий. Когда я попытался загрузить те же фотографии в ImageLoader, я получил (Permission denied)
ошибка. Решение заключалось в том, чтобы явно добавить
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
поскольку указанное выше разрешение ограничивает только разрешение на запись до версии API 18, а вместе с ним и разрешение на чтение.
ответ дан 14 окт ’15, 14:10
В дополнение ко всем ответам, если клиенты используют Android 6.0, в Android добавлены новые модель разрешений для (Зефир).
Уловка: Если вы ориентируетесь на версию 22 или ниже, ваше приложение будет запрашивать все разрешения во время установки, как и на любом устройстве под управлением ОС ниже Marshmallow. Если вы пытаетесь использовать эмулятор, то начиная с Android 6.0 и далее вам необходимо явно перейти в настройки-> приложения-> YOURAPP-> разрешения и изменить разрешение, если вы его дали.
Создан 08 сен.
Странно после того, как поставили косую черту «/» перед моим новый файл моя проблема была решена. Я изменил это:
File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");
к этому:
File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");
ОБНОВИТЬ: как упоминалось в комментариях, правильный способ сделать это:
File myFile= new File(Environment.getExternalStorageDirectory(), "newFile");
ответ дан 06 авг.
У меня была такая же проблема, и ни одно из предложений не помогло. Но я нашел для этого интересную причину на физическом устройстве Galaxy Tab.
Когда USB-накопитель включен, разрешения на чтение и запись для внешнего накопителя не действуют. Просто отключите USB-накопитель, и с правильными разрешениями проблема будет решена.
Создан 30 ноя.
Я ожидал бы все ниже /data
принадлежать «внутренней памяти». Однако вы должны иметь возможность писать на /sdcard
.
Создан 13 янв.
Измените свойство разрешения в вашем /system/etc/permission/platform.xml
и группа должна быть упомянута, как показано ниже.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
<group android:gid="sdcard_rw" />
<group android:gid="media_rw" />
</uses-permission>
Создан 11 фев.
У меня была такая же ошибка, когда я пытался записать изображение в папку DCIM / camera на Galaxy S5 (android 6.0.1), и я понял, что только эта папка ограничена. Я просто мог писать в DCIM / любую папку, но не в камеру. Это должно быть ограничение / настройка на основе бренда.
ответ дан 21 авг.
Может быть, ответ такой:
на устройствах с API> = 23, если вы устанавливаете приложение (приложение не является системным), вы должны проверить разрешение хранилища в «Настройки — приложения», есть список разрешений для каждого приложения, вы должны проверить его! пытаться
ответ дан 28 апр.
Когда ваше приложение принадлежит системному приложению, оно не может получить доступ к SD-карте.
Создан 30 ноя.
имейте в виду, что даже если вы установили все правильные разрешения в манифесте: единственное место, где сторонним приложениям разрешено писать на вашей внешней карте, — это «их собственные каталоги» (т.е. / sdcard / Android / data /), пытающиеся писать в в другом месте: вы получите исключение: EACCES (в разрешении отказано)
ответ дан 25 дек ’18, 20:12
Environment.getExternalStoragePublicDirectory();
При использовании этого устаревшего метода начиная с Android 29 вы получите ту же ошибку:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Разрешение здесь:
getExternalStoragePublicDirectory устарела в Android Q
Создан 19 июля ’19, 12:07
Чтобы сохранить файл в directory
который является чужим для каталога приложения, ограниченный выше API 29+
. Итак, чтобы сгенерировать новый файл или создать новый файл, используйте каталог вашего приложения следующим образом: —
Итак, правильный подход: —
val file = File(appContext.applicationInfo.dataDir + File.separator + "anyRandomFileName/")
Вы можете записать любые данные в этот сгенерированный файл!
Приведенные выше file
доступен и не будет throw any exception
потому что он находится в вашем собственном разработанное приложение каталог.
Другой вариант android:requestLegacyExternalStorage="true"
in manifest application tag
как предложено Uriel
но это не постоянное решение!
ответ дан 01 апр.
В моем случае я использовал библиотека выбора файлов который вернул путь к внешнему хранилищу, но он начался с /root/
. И даже с WRITE_EXTERNAL_STORAGE разрешение предоставлено во время выполнения, я все еще получаю ошибку EACCES (в доступе отказано).
Так что используйте Environment.getExternalStorageDirectory()
чтобы получить правильный путь к внешнему хранилищу.
Пример:
Не могу написать: /root/storage/emulated/0/newfile.txt
Могу написать: /storage/emulated/0/newfile.txt
boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();
Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
Выход 1:
externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0
Выход 2:
externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488
ответ дан 28 авг.
Я создаю папку в / data / в моем init.rc (возится с aosp на Nexus 7) и имел именно эту проблему.
Оказалось, что разрешения папки rw (666) было недостаточно, и это должно было быть rwx (777), тогда все сработало!
Создан 06 янв.
Принудительное применение разрешений на хранилище после версии 6.0 можно обойти, если у вас есть рутированное устройство, с помощью следующих команд adb:
root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive
Создан 02 сен.
Для Android 11 Разрешение
Объявить разрешение MANAGE_EXTERNAL_STORAGE в manifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
в коде проверить разрешение на управление хранилищем
if (Environment.isExternalStorageManager()==false) {
Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
startActivity(new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri));
} else {
// TO do.. open file picker intent
}
все остальные коды разрешений для файлов должны совпадать с кодом ниже версии Android 11.
ответ дан 12 мар ’21, в 07:03
Добавить разрешение в манифест.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
ответ дан 21 окт ’16, 10:10
У меня была такая же проблема (API> = 23).
решение https://stackoverflow.com/a/13569364/1729501 у меня сработало, но отключать приложение для отладки было непрактично.
Мое решение состояло в том, чтобы установить правильный драйвер устройства adb в Windows. Драйвер Google USB не работал на моем устройстве.
ШАГ 1. Загрузите драйверы adb для вашего устройства.
ШАГ 2. Перейдите в диспетчер устройств -> другие устройства -> найдите записи со словом «adb» -> выберите «Обновить драйвер» -> укажите местоположение на шаге 1.
ответ дан 23 мая ’17, 13:05
Добавить зависимости Gradle
implementation 'com.karumi:dexter:4.2.0'
Добавьте приведенный ниже код в свою основную деятельность.
import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
checkMermission();
}
}, 4000);
}
private void checkMermission(){
Dexter.withActivity(this)
.withPermissions(
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET
).withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.isAnyPermissionPermanentlyDenied()){
checkMermission();
} else if (report.areAllPermissionsGranted()){
// copy some things
} else {
checkMermission();
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
ответ дан 08 апр.