Android 23以下 checkSelfPermission 失败记录
2017-07-07 16:31
661 查看
在开发过程中发现在android6.0系统以下版本的手机中,如果用户禁用掉了电话权限。
那么当用户点击拨打电话的图标时会毫无反应,用户体验蛮差。
通过查资料发现,系统23以下 checkSelfPermission 方法是无效的,永远返回 0
下面记录一下我想到的android6.0系统以下当电话权限被用户禁用掉后的提醒问题:
主要因素:
1、一个静态的标识
2、重写Activity的 onPause()方法,在onPause()方法调用时 PHONE_CLICK_NUM 置0
3、在电话图标的点击监听事件中进行处理
实际思路是:
如果应用有电话权限时,则在点击电话图标时能正常跳转,这是必然会调用当前Activity的onPause方法,或者系统弹出提示框让用户选择是否开启/关闭应用权限时都会调用onPause,这时不会跳出提示语句
只要在应用没有该权限的情况下,用户第一次点击,系统没有反应,PHONE_CLICK_NUM 增加为1.用户第二次点击时PHONE_CLICK_NUM 自增为2,触发弹出提醒语句
完整的处理代码
http://www.jianshu.com/p/d3a998ec04ad
那么当用户点击拨打电话的图标时会毫无反应,用户体验蛮差。
通过查资料发现,系统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
相关文章推荐
- targetSdkVersion 23以下6.0中调用checkSelfPermission的问题
- targetSdkVersion 23以下6.0中调用checkSelfPermission的问题
- checkSelfPermission 找不到 Android 动态权限问题
- Android 调用checkSelfPermission,不管用户是否取消授权,checkSelfPermission的返回值始终为PERMISSION_GRANTED的解决办法
- Android 6.0 手机 Checkselfpermission无效
- android checkSelfPermission方法使用注意
- Android权限检查API checkSelfPermission失效问题
- u.aly.bt: can't find referenced method 'int checkSelfPermission(java.lang.String)' 混淆失败的问题
- targetSdkVersion<23中调用checkSelfPermission的问题
- checkSelfPermission 找不到 Android 动态权限问题
- can't find referenced method 'int checkSelfPermission(java.lang.String) 混淆失败的问题
- Android: java.lang.NoSuchMethodeError: xxx.xxx.checkSelfPermission
- Android权限检查API checkSelfPermission失效问题
- 【Android】java.lang.SecurityException: Permission Denial: starting Intent 应用启动失败异常
- Android L 软件安装失败 INSTALL_FAILED_DUPLICATE_PERMISSION
- 【原创】android 7.0 通知报错 java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group
- Android实践异常记录self
- android studio check for update 更新失败
- Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题
- checkSelfPermission 无效的解决办法