我打开失败:在Android 5.1中尝试将数据写入SD卡时出现EACCES(权限被拒绝)错误,为什么?
我需要将一些数据保存到SD卡,我已添加权限 到AndroidManifest.xml文件,当我在Android 4.12 mobile中测试它时,我可以得到正确的结果 但是我打开失败了:当我在安卓5.1手机上测试它时,EACCES(权限被拒绝)错误,为什么 顺便说一句,我读过这篇文章,但现在我的手机是三星安卓5.1 代码我打开失败:在Android 5.1中尝试将数据写入SD卡时出现EACCES(权限被拒绝)错误,为什么?,android,Android,我需要将一些数据保存到SD卡,我已添加权限 到AndroidManifest.xml文件,当我在Android 4.12 mobile中测试它时,我可以得到正确的结果 但是我打开失败了:当我在安卓5.1手机上测试它时,EACCES(权限被拒绝)错误,为什么 顺便说一句,我读过这篇文章,但现在我的手机是三星安卓5.1 代码 private void ActionUploadFiles(Map<String, String> files,IHTTPSession session,Str
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());
}
}
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"
}
}
}
因为您有
targetSdkVersion 23
这就是为什么会出现安全异常,所以必须降级到targetSdkVersion 22
或添加运行时权限。请检查此链接
更新:
您缺少从Android Lollipop引入的运行时权限。您可以做的是启用权限。要执行此操作,请转到
设置->应用->你的应用->权限
并启用权限,然后对其进行测试
要添加运行时权限,您可以在onCreate()内询问
然后听听这样的允许接受或拒绝
@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();
}
}
从Kitkat开始,Android限制第三方应用程序对SD卡的写访问。他们介绍了执行这些操作的方法。要写入SD卡上的文件,您需要使用这些API
对于一些运行棒棒糖的设备,您可以使用这些api获得对文件的写访问权。由于我自己没有使用api,因此无法向您提供代码片段。但是这个链接肯定会帮助你解决这个问题
您可以查看他们如何处理这种情况的流程。可能是因为您的设备不允许应用程序访问存储
通常,此错误伴随着权限被拒绝而来,因此,如果您使用物理设备作为模拟器来运行应用程序,请转到设备中的设置,然后转到应用程序管理器。找到你的应用并转到“权限”,然后允许为你的应用存储权限,然后重试。哪个SD卡
?你说的是模拟SD卡(外部存储),还是物理SD卡(如microSD等)谢谢!这是物理SD卡,我在真正的Android 4.2手机和真正的Android 5.1手机上测试了代码。在Android 4.4+上写物理SD卡很难。你不能用常规的方法来做。您必须使用Storage Access Framework:完全不清楚您是如何确定SD卡的路径的。而且你没有告诉我这条路到底是什么。请提供所有信息。绿色应用:我希望我能写SD卡的所有路径。谢谢!我已经设置了targetSdkVersion 22,但我仍然无法打开:EACCES(权限被拒绝)!如果设备运行的是安卓5.1或更低版本,或者应用程序的目标SDK为22或更低版本,或者设备运行的是安卓6.0或更高版本,并且应用程序的目标SDK为23或更高版本,那么您将无法注意到一件事。此答案没有帮助,谢谢!但我认为应该是这样的(ContextCompat.checkSelfPermission(EditDisplayPicture.this,Manifest.permission.READ\u EXTERNAL\u STORAGE)!=PackageManager.permission\u grated | ContextCompat.checkSelfPermission(EditDisplayPicture.this,Manifest.permission.WRITE\u EXTERNAL\u STORAGE)!=PackageManager.permission\u grated)。。。对吗?如果要在两个权限都已启用时继续,则应和权限。无论如何,建议使用&&
,因为您总是在应用程序中请求所需的权限,如果任何人已启用,则继续操作是毫无意义的。谢谢!请你看看Ronny Kibet的用法,或者你可以用它来代替ANDIt的基本编程概念。你知道&&
和|
的意思,所以根据需要使用它。
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();
}
}