Android 6.0 动态请求权限
描述:*Android 应用在访问额外的资源或信息时,需要请求相应权限。根据权限的敏感性,系统可能会自动授予权限,或者由用户对请求进行许可。Android6.0及以上应用除了在清单文件中声明权限,敏感权限还需要在用户使用时动态授予。官方定义了普通和危险权限,经测试发现部分手机厂商的敏感权限会有所差异*。
问题:应用中用到 READ_PHONE_STATE 权限来获取设备ID,在华为、小米的6.0系统的手机上运行都可以正常获取,然而在Nexus5X上获取失败而导致应用闪退。
原因:华为、小米等系统会默认允许该权限,而官方定义该权限为危险权限默认不被允许。
解决:
1,将 targetSdkVersion 版本号调整为 23 以下,这样应用不需要在运行时请求权限,系统会默认允许清单文件中所有权限。
2,在应用中向用户动态请求权限,请求方式如下:
private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
......
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Android M Permission check
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_COARSE_LOCATION:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// TODO request success
}
break;
}
}
用如上这种方式处理非常的繁琐,所以笔者决定采用这个 第三方库 来处理这个事情。
关于 第三方库 的使用与说明待续……