Ошибка при открытии не удалось: ошибка EACCES (Permission denied) при попытке записать данные на SD-карту в Android 5.1, почему?
Мне нужно сохранить некоторые данные на SD-карту, я добавлю разрешение
в файл AndroidManifest.xml, и я могу получить правильный результат, когда тестирую его на Android 4.12 mobile.
Но я не получился открытым: ошибка EACCES (Permission denied), когда я тестирую его на Android 5.1, почему?
Кстати, я прочитал художественное Android 6.0 open failed: EACCES (Permission denied) и Исключение: open failed: EACCES (Permission denied) "на Android, но теперь мой мобильный телефон - это SamSung Android 5.1
код
private void ActionUploadFiles(Map<String, String> files,IHTTPSession session,String uploadFolder){
try{
Set<String> keys = files.keySet();
for (String key:keys) {
String location = files.get(key);
File source = new File(location);
String filename= session.getParms().get(key);
filename=FilenameUtils.getName(filename);
File target = new File(uploadFolder,filename);
FileUtils.copyFile(source,target);
}
}
catch (Exception e) {
Utility.LogError("Upload Error: "+ e.getMessage());
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="info.dodata.wifi">
<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>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.vending.BILLING" />
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
multiDexEnabled true
applicationId "info.dodata.wifi"
minSdkVersion 16
targetSdkVersion 23
versionCode 4
versionName "1.04"
archivesBaseName = "WiFiFileTransfer-V" + versionName
}
productFlavors {
free {
applicationId "info.dodata.wifi"
}
pro {
applicationId "info.dodata.wifi.pro"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean", "IsDebugMode", "false"
}
debug {
buildConfigField "boolean", "IsDebugMode", "true"
}
}
}
Ответы
Ответ 1
Вам не хватает разрешений во время выполнения, установленных на Android Lollipop. Вы можете разрешить разрешение. Для этого перейдите к
Settings -> Apps -> YOUR_APP -> Permissions
и разрешить разрешения, а затем проверить его.
Чтобы добавить разрешение во время выполнения, вы можете запросить внутри onCreate()
.
String[] permission ={Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if(ContextCompat.checkSelfPermission(EditDisplayPicture.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(EditDisplayPicture.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ActivityCompat.requestPermissions(YourActivity.this, permission, 1);
}
} else proceedFurther();
И затем прислушайтесь к принятию или отрицанию разрешения, как это,
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
proceedFurther();
} else {
Toast.makeText(YourActivity.this, "You need to give permission in order to proceed further.", Toast.LENGTH_SHORT).show();
}
}
Ответ 2
потому что у вас есть targetSdkVersion 23
, поэтому вы получаете исключение безопасности, вам нужно понизить до targetSdkVersion 22
или добавить разрешение времени выполнения. пожалуйста, проверьте эту ссылку https://developer.android.com/training/permissions/requesting.html
Обновление: open failed: EACCES (Permission denied)
Ответ 3
Запуск Kitkat, Android ограниченный доступ на запись SDCARD к сторонним приложениям. Они внедрили Storage Access Framework для выполнения операций. Для записи в файлы на SDCard вам нужно будет использовать эти API.
Для некоторых устройств, на которых запущен Lollipop, вы можете получить доступ на запись к файлам с помощью этих api. Поскольку я сам не использовал api, я не могу предоставить вам фрагмент. Но ссылка, безусловно, поможет вам решить проблему.
Вы можете посмотреть Es Explorer, чтобы увидеть, как они обрабатывают этот сценарий.