android6.0开发中遇到的权限坑

android的权限在23以下的版本中自动授权,而这个版本及以上需要用户手动授权。这对用户隐私来说当然有好处,比如我不想app获取我的位置。对开发来说,虽然麻烦是避免不了了,但是也不是很蛋疼。
对于权限问题,系统分为一般权限和危险权限。一般权限在xml中申明就行,而危险权限除了申明外,还需要额外动态申请(运行时)。
具体的权限分类可以看这:权限知识整理
实际开发中遇到的问题:请求读写,系统设置,相机等(全奔溃~)
开发中强烈建议不要等项目做得差不多再去解决权限的问题,而是遇到需要动态申请权限的时候就去解决。
解决办法(一步一步进阶):
1:可以自己在需要权限时申请权限:

这里以请求打电话为例子。
在点击拨打按钮时,在监听中加入以下代码。

//检查权限,PERMISSION_GRANTED代表获得权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    //进入到这里代表没有权限.
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE);
} else {
//有权限则执行拨打电话
    call();
}

没有权限,然后提出权限申请后,会走下面这个方法。该方法需要重写,在Fragment与Activity里都有。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode){
        case REQUEST_CODE:
            if(grantResults.length >0 &&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                //用户同意授权
                callPhone();
            }else{
                //用户拒绝授权,在这里可以做一些别的,比如不进入下一页面或者提示等等
            }
            break;
    }
}

如果用户没有授权,并且再次点击的时候哦多尅(怎么办)?做个简单的用户提示吧。

public void call(View v) {
    //检查权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
            != PackageManager.PERMISSION_GRANTED) {
        //进入到这里代表没有权限.

        if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)){
            //已经禁止提示了
            Toast.makeText(MainActivity.this, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();
        }else{
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE);

        }

    } else {
        callPhone();
    }
}

谷歌推荐的流程是这样的(权限是否已经授予,没有则申请):

int checkCameraPermission =  ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA);

    if (checkCameraPermission != PackageManager.PERMISSION_GRANTED) {
    /*
        用户未授权,谷歌推荐标准流程
    */
    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.CAMERA)) {
        //Show an expanation to the user asynchronously.说明请求原因,之前被用户拒绝过
        showRequestPermissionRationale("请授权", new DialogInterface.OnClickListener(){
            @Override 
            public void onClick(DialogInterface dialog, int which) {
                //点击确定时再次申请权限
                requestPermissions(new String[] { Manifest.permission.CAMERA},REQUEST_PERMISSION_CAMERA);
                    }
                });
    } else {
        //第一次申请时,请求授权
        requestPermissions(new String[] { Manifest.permission.CAMERA },REQUEST_PERMISSION_CAMERA);
    }
}

以上就是对权限最简单的申请与处理方式,其实很简单。但总不能对应用中每个需要申请权限的地方写这么多相同的代码吧。
那就封装吧。
直接用人家的吧, GitHub PermissionGen,里面有使用方法和说明。源码还没研究过,以后再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值