Hel*_*nce 57 java android android-6.0-marshmallow
我已经加入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;
}
Run Code Online (Sandbox Code Playgroud)
Android 6.0在许可方面有区别吗?
And*_*eky 51
Android为Android 6.0(Marshmallow)添加了新的权限模型.
所以你必须检查Runtime Permission:
什么是运行时权限?
借助Android 6.0 Marshmallow,Google引入了一种新的权限模型,允许用户更好地理解应用程序可能要求特定权限的原因.现在,系统会提示用户在应用程序使用期间必要时接受权限,而不是用户在安装时盲目接受所有权限.
何时实施新模式?
在您选择在应用程序中定位版本23之前,它不需要完全支持.如果您的目标是22或更低版本,您的应用程序将在安装时请求所有权限,就像在Marshmallow下运行操作系统的任何设备上一样.
此信息来自此处:
请通过此链接查看如何实施:
Ham*_*ian 49
在Android 6(Marshmallow)中,即使用户在安装时接受了所有权限,他们也可以稍后决定从您那里获取一些权限.
快速解决方案,但不建议:也许如果你改变你targetSdkVersion的gradle 22,问题将得到解决.
如何实施?(最佳实践)
首先确定用户的设备是否是Marshmallow设备:
private boolean shouldAskPermission(){
return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);
}
Run Code Online (Sandbox Code Playgroud)如果shouldAskPermission()退货true,请求您的许可:
String[] perms = {"android.permission.WRITE_EXTERNAL_STORAGE"};
int permsRequestCode = 200;
requestPermissions(perms, permsRequestCode);
Run Code Online (Sandbox Code Playgroud)该方法requestPermissions(String[] permissions, int requestCode);是在Android Activity类中找到的公共方法.
您将在onRequestPermissionResult方法中收到您的请求结果,如下所示:
@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
switch(permsRequestCode){
case 200:
boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
break;
}
}
Run Code Online (Sandbox Code Playgroud)收到结果后,您需要适当地处理它们.
建议的权限流程:
更多信息:
具有Marshmallow设备的用户现在可以通过应用程序设置撤消危险权限
Android将某些权限定义为" 危险 ",将某些权限定义为" 正常".两者都在应用程序的清单中是必需的,但只有危险权限才需要运行时请求.
如果您已选择不实施新的权限模型(运行时请求),则撤销权限可能会导致不必要的用户体验,并且在某些情况下会导致应用程序崩溃.
下表列出了所有当前危险权限及其各自的组:
如果用户接受组/类别中的一个权限,则他们接受整个组!
资料来源:http://www.captechconsulting.com
使用Dexter库:
你可以使用Dexter.Android库,简化了在运行时请求权限的过程.
c0m*_*ing 13
您还可以使用ActivityCompat.requestPermissions进行向后兼容.
例:
private static final int REQUEST_CODE = 0x11;
String[] permissions = {"android.permission.WRITE_EXTERNAL_STORAGE"};
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE); // without sdk version check
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// save file
} else {
Toast.makeText(getApplicationContext(), "PERMISSION_DENIED", Toast.LENGTH_SHORT).show();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ron*_*bet 10
从API-23开始,即使您已在清单中声明,也需要在活动中声明权限.
// Storage Permissions variables
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//persmission method.
public static void verifyStoragePermissions(Activity activity) {
// Check if we have read or write permission
int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
Run Code Online (Sandbox Code Playgroud)
使用简单地调用verifyStoragePermissions(this);onCreate.这应该是有希望的.
| 归档时间: |
|
| 查看次数: |
91620 次 |
| 最近记录: |