一尘不染

Android 6.0打开失败:EACCES(权限被拒绝)

java

我已经加入uses-permission包括WRITE_EXTERNAL_STORAGE,MOUNT_UNMOUNT_FILESYSTEMS,READ_EXTERNAL_STORAGE来AndroidManifest.xml

当我尝试在Nexus5(Android 6.0)中运行我的应用程序时,它引发了如下异常:

java.io.IOException: open failed: EACCES (Permission denied)

然后我尝试了另一部Android手机(Android 5.1),一切正常。代码如下:

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);
    currentPhotoPath = image.getAbsolutePath();
    return image;
}

Android 6.0在权限方面有区别吗?


阅读 736

收藏
2020-03-19

共1个答案

一尘不染

在Android 6(Marshmallow)中,即使用户在安装时接受了你的所有权限,他们仍可以稍后决定从你手中夺走其中一些权限。

快速解决方案,但不建议使用:也许如果targetSdkVersion将gradle 更改为22,则问题将得到解决。

如何实施?(最佳做法)

  1. 首先确定用户的设备是否是棉花糖设备:
private boolean shouldAskPermission(){

return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);

}
  1. 如果shouldAskPermission()返回true,则需要你的许可:
String[] perms = {"android.permission.WRITE_EXTERNAL_STORAGE"};

int permsRequestCode = 200;

requestPermissions(perms, permsRequestCode);

该方法requestPermissions(String[] permissions, int requestCode);是在Android Activity类内部找到的公共方法。

  1. 你将在onRequestPermissionResult方法中收到请求的结果,如下所示:
@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){

switch(permsRequestCode){

    case 200:

        boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;

        break;

}

}

收到结果后,你将需要适当地处理它们。

2020-03-19