Android 23以下 checkSelfPermission 失败记录

在开发过程中发现在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() {
                        @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,android,权限)