我打开失败:在Android 5.1中尝试将数据写入SD卡时出现EACCES(权限被拒绝)错误,为什么?

我打开失败:在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

我需要将一些数据保存到SD卡,我已添加权限 到AndroidManifest.xml文件,当我在Android 4.12 mobile中测试它时,我可以得到正确的结果

但是我打开失败了:当我在安卓5.1手机上测试它时,EACCES(权限被拒绝)错误,为什么

顺便说一句,我读过这篇文章,但现在我的手机是三星安卓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());
        }
    }
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();
    }
}