Android 23以下 checkSelfPermission 失败记录

来源:互联网 发布:淘宝卖家修改评价链接 编辑:程序博客网 时间:2024/05/17 23:16

在开发过程中发现在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

阅读全文
0 0
原创粉丝点击