我已经加入uses-permission包括WRITE_EXTERNAL_STORAGE,MOUNT_UNMOUNT_FILESYSTEMS,READ_EXTERNAL_STORAGE来AndroidManifest.xml。
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在权限方面有区别吗?
在Android 6(Marshmallow)中,即使用户在安装时接受了你的所有权限,他们仍可以稍后决定从你手中夺走其中一些权限。
快速解决方案,但不建议使用:也许如果targetSdkVersion将gradle 更改为22,则问题将得到解决。
如何实施?(最佳做法)
private boolean shouldAskPermission(){ return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1); }
shouldAskPermission()
true
String[] perms = {"android.permission.WRITE_EXTERNAL_STORAGE"}; int permsRequestCode = 200; requestPermissions(perms, permsRequestCode);
该方法requestPermissions(String[] permissions, int requestCode);是在Android Activity类内部找到的公共方法。
requestPermissions(String[] permissions, int requestCode)
onRequestPermissionResult
@Override public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){ switch(permsRequestCode){ case 200: boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED; break; } }
收到结果后,你将需要适当地处理它们。