Android之权限问题

Android之权限问题

 

android6.0(即Android M)及以上版本区分了:普通权限和危险权限。普通权限可以直接在清单文件里面申请, 危险权限不仅要在清单文件里面申请,还要在代码里面动态获取。如果你仅仅动态获取了, 没有在清单文件里面申明,在你返回的回调方法里面会被拒绝给权限。

由于以前4.2的版本用的比较多这个一直没有留意这个。最近改用6.0,7.0,8.0了所以就记录下。

关于权限的动态获取先说下简单的思路。

第一步:判断当前系统的版本如果低于6.0那还是用老办法在清单文件里面申明即(AndroidManiferst.xml里面声明)。

第二步:判断当前需要的权限是否已经获取,如果没有获取则动态获取,否则就可以不做处理。

第三步:动态获取权限。即弹窗提示用户获取该权限的作用,由用户选择是否给予该权限。

第四步:相应回调。

代码如下

  
   /*AndroidManifest.xml*/
    <uses-permission android:name="android.permission.CALENDAR"/>
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>




  core:


    String[] permission = {Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR};//需要的权限
    String title = "日历权限不可用";
    String content = "由于应用需要或者当前日历设置相应属性,所以需要日历相关权限;\n否则,您将无法正常使用日历功能";


    initPermission(permission,title,content);



    /*初始化应用权限*/
    private void initPermission(String[] permission, String title, String content) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            List<String>permissionList = new ArrayList<>();
            for(int i = 0;i<permission.length;i++){
                if(ContextCompat.checkSelfPermission(this,permission[i]) != PackageManager.PERMISSION_GRANTED ){
                    permissionList.add(permission[i]);
                }
            }
            if(!permissionList.isEmpty()){
                showDialogTipUserRequestPermisson(permissionList,title,content);
            }
        }

    }


    /*提示用户正在申请问题*/
    private void showDialogTipUserRequestPermisson(final List<String> permissionList, String title, String content) {
        new AlertDialog.Builder(this).setTitle(title).setMessage(content).setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                startRequestPermission(permissionList);
            }

        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                finish();
            }
        }).setCancelable(false).show();

    }

    /*权限申请*/
    private void startRequestPermission(List<String> permissionList) {
        if(!permissionList.isEmpty()){
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this,permissions,1010);
        }
    }

    /*获取权限回调方法*/
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1010){
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                if (grantResults.length > 0){
                    for (int i = 0; i< grantResults.length;i++){
                        int grantResult = grantResults[i];
                        switch (grantResult){
                            case PackageManager.PERMISSION_GRANTED://权限被授予
                                Toast.makeText(this,permissions[i]+"权限获取成功",Toast.LENGTH_SHORT).show();
                                break;
                            case PackageManager.PERMISSION_DENIED://权限被拒绝
                                Toast.makeText(this,permissions[i]+"权限获取失败",Toast.LENGTH_SHORT).show();
                                finish();
                                break;

                        }
                    }

                }
            }
        }
    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值