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

Android 23以下 checkSelfPermission 失败记录

2017-07-07 16:31 661 查看
在开发过程中发现在android6.0系统以下版本的手机中,如果用户禁用掉了电话权限。

那么当用户点击拨打电话的图标时会毫无反应,用户体验蛮差。

通过查资料发现,系统23以下 checkSelfPermission 方法是无效的,永远返回 0

下面记录一下我想到的android6.0系统以下当电话权限被用户禁用掉后的提醒问题:

主要因素:

1、一个静态的标识

public static int PHONE_CLICK_NUM = 0;//为解决23系统下的电话权限被关闭时无法获取权限状态,而设置的标识位


2、重写Activity的 onPause()方法,在onPause()方法调用时 PHONE_CLICK_NUM 置0

@Override
protected void onPause() {
super.onPause();
CoreCommonUtil.PHONE_CLICK_NUM = 0;
}


3、在电话图标的点击监听事件中进行处理

btn_phone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CoreCommonUtil.PHONE_CLICK_NUM ++;
if (CoreCommonUtil.PHONE_CLICK_NUM  >1){
Toast.makeText(context, "电话权限未打开,请前往设置开启", Toast.LENGTH_SHORT).show();
}
...
}
});


实际思路是:

如果应用有电话权限时,则在点击电话图标时能正常跳转,这是必然会调用当前Activity的onPause方法,或者系统弹出提示框让用户选择是否开启/关闭应用权限时都会调用onPause,这时不会跳出提示语句

只要在应用没有该权限的情况下,用户第一次点击,系统没有反应,PHONE_CLICK_NUM 增加为1.用户第二次点击时PHONE_CLICK_NUM 自增为2,触发弹出提醒语句

完整的处理代码

/**
* 使用系统电话拨打功能
* 注:需要在所属的 Activity中重写 onPause()
*
*     protected void onPause() {
super.onPause();
CoreCommonUtil.PHONE_CLICK_NUM = 0;//置0
}
* @param context
* @param telStr
*/
public static void usePhoneCall(final Context context, String telStr){
CoreCommonUtil.PHONE_CLICK_NUM ++;
if (CoreCommonUtil.PHONE_CLICK_NUM  >1){
Toast.makeText(context, "电话权限未打开,请前往设置开启", Toast.LENGTH_SHORT).show();
}

if (TextUtils.isEmpty(telStr)) return;
if (!CoreCommonUtil.selfPermissionGranted(Manifest.permission.CALL_PHONE,context)){
Toast.makeText(context, "电话权限未打开,请前往设置开启", Toast.LENGTH_SHORT).show();
}

Uri uri = Uri.parse("tel:" + telStr); // 拨打电话号码的URI格式
final Intent it = new Intent(); // 实例化Intent
it.setAction(Intent.ACTION_CALL); // 指定Action
it.setData(uri); // 设置数据

if (Build.VERSION.SDK_INT >= 23){

RxPermissions.getInstance(context)
.request(Manifest.permission.CALL_PHONE)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
if (aBoolean) {
context.startActivity(it);
}
}
});
}else {
context.startActivity(it);
}
}

/**
* 权限是否开启校验
* @param permission
* @return
*/
public static boolean selfPermissionGranted(String permission,Context context) {
// For Android < Android M, self permissions are always granted.
boolean result = true;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (getTargetSDKVersion(context)>= Build.VERSION_CODES.M) {
// targetSdkVersion >= Android M, we can
// use Context#checkSelfPermission
result = context.checkSelfPermission(permission)
== PackageManager.PERMISSION_GRANTED;
} else {
// targetSdkVersion < Android M, we have to use PermissionChecker
result = PermissionChecker.checkSelfPermission(context, permission)
== PermissionChecker.PERMISSION_GRANTED;
}
}

return result;
}


参考资料

一行代码解决Android M新的运行时权限问题

http://www.jianshu.com/p/d3a998ec04ad
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 权限