关于安卓6.0的运行时权限,之前只需要再manifest清单中配置即可。6.0之后加入了运行时权限。
参考文章:http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/
以拨打电话为例:之前只需要再manifest清单中配置如下权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.looker.test">
<!--拨打电话权限-->
<uses-permission android:name="android.permission.CALL_PHONE"/>
然后遇到的问题是,在Android6.0目标平台下,即便已经添加了打电话的权限,运行时依然会报错安全异常:权限被拒绝。
可以在代码中加入系统版本判断,如果6.0及以上需要获取运行时权限;
/***
* 判断权限
*/
private void checkPermission() {
//判断手机版本号是否6.0
if(Build.VERSION.SDK_INT >= 23){
// 检查是否获得了权限(Android6.0运行时权限)
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
// 没有获得授权,申请授权
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.CALL_PHONE)) {
// 返回值:
// 如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true.
// 如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false.
// 如果设备策略禁止应用拥有这条权限, 这个方法也返回false.
// 弹窗需要解释为何需要该权限,再次请求授权
Toast.makeText(getActivity(), "请授权!", Toast.LENGTH_LONG).show();
// 帮跳转到该应用的设置界面,让用户手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}else{
// 不需要解释为何需要该权限,直接请求授权
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.CALL_PHONE}, 0);
}
}else {
// 已经获得授权,可以打电话
callPhone();
}
}else {
callPhone();
}
}
/***
* 拨打电话
*/
private void callPhone() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel: 13675082546"));
startActivity(intent);
}