您的位置:首页 > 移动开发 > Android开发

安卓6.0+动态权限申请

2017-03-16 16:49 330 查看
在公司手机应用中,用到了拍照和选择相册图片的功能。某次同事用华为手机使用,不妙的是这块功能导致应用卡死崩溃。查阅了下资料,便知道是因为少了动态权限申请所导致的

1.动态权限的由来

Android6.0以前,我们只需要在AndroidManifest文件中声明需要的权限,用户安装时同意权限,APP便永久的获得了授权。然而,同期的iOS对于权限的处理会更加灵活,在APP运行时,用户可以根据自身的需要,决定是否授予APP某一权限。这样动态管理的机制更有利于保护用户的隐私,Android过于简单的权限机制被吐槽已久。终于,Android6.0也发布了动态权限的机制。

2.动态权限的基本知识

动态权限的分类

普通权限

普通权只要在AndroidManifest文件中声明即可

危险权限

新的权限机制提出来了权限组的概念,即获取了权限组的中某个权限,便自动获取的组内全部的权限,如下图是要动态申请的危险权限



使用场景

当应用的targetSdkVersion<23时,没有适配权限的申请相关逻辑,在Android6.0以上机型运行的时候,仍然采用安装时授权的方案。

当应用的targetSdkVersion>=23时,在低版本Android系统上运行,仍然采用安装时授权的方案,权限申请的代码逻辑只应该在Android6.0及以上的机型被执行。

3.如何申请动态权限

1 、检查是否有所需权限

public int checkSelfPermission(permission)


2、申请权限

public final void requestPermissions( new String[permission1,permission2,...], requestCode)


3、权限回调

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
//继续执行逻辑或者提示权限获取失败
}


4、权限说明。

用户如果选择了拒绝,下一次在需要声明该权限的时候,Google建议APP开发者给予用户更多的说明,因此提供了下面这个API

public boolean shouldShowRequestPermissionRationale(permission)
{
1、APP没有申请这个权限的话,返回false
2、用户拒绝时,勾选了不再提示的话,返回false
3、用户拒绝,但是没有勾选不再提示的话,返回true
因此如果想在第一次就给用户提示,需要记录权限是否申请过,没有申请过的话,强制弹窗提示,而不能根据这个方法的返回值来。
}


4.在应用中使用示例

以下为申请拍照权限

if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,}, 5);
} else {
onCamera();
}
} else {
onCamera();
}


权限申请回调

/**
* 运行时权限申请回调
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 5:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onCamera();
} else {
Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
}
break;
}
}


这里我判断了SDK版本,当版本大于22时才执行申请动态权限的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息