Android动态权限

来源:互联网 发布:好的淘宝零食店铺 编辑:程序博客网 时间:2024/06/15 07:54
Android6.0权限分为了两种,一种是普通权限,一种是危险权限
而我们要使用危险权限的时候,就需要动态申请了,而危险权限一共9组26种



可以到该网址查看权限https://developer.android.com/reference/android/Manifest.permission.html


如果应用程序在manifest中声明了一个危险权限,并且他目前没有该权限组中的任一权限,那么系统会弹出一个将要申请的权限组的对话框,但是该对话框不会具体描述是该权限组中的哪一个权限,比如应用程序需要READ_CONTACTS权限,那么该对话框仅仅只描述为该应用程序需要访问联系人


如果应用程序在manifest中声明了一个危险权限,并且他已经拥有该权限组的其他权限,那么该系统将直接允许其访问该权限,并且不与用户产生交互


我在文件清单中配置:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

一个Button点击的时候,进行拨号,当我写完红色部分的时候,根据提示生成了棕色部分的代码(该代码用于判断该程序是否具有拨号的的权限)。


我运行该程序到Android6.0的时候会提示没有权限,但我明明在配置清单中写了啊,其实这就需要我们运行时申请权限了


Android提供了一个比较实用的方法shouldShowRequestPermissionRationale(),该方法给了我们一个解释的机会来增加权限申请通过的概率。如果该权限之前已被申请过但是被用户拒绝,那么shouldShowRequestPermissionRationale()方法返回true。


下面的代码判断如果没有权限,然后继续判断是否之前申请权限的时候被用户拒绝,
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + 10086));
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)        != PackageManager.PERMISSION_GRANTED) {       Toast.makeText(MainActivity.this,"没有权限",Toast.LENGTH_SHORT).show();    if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.CALL_PHONE)){        //如果之前有申请,但是被用户拒绝了,则返回true       Toast.makeText(MainActivity.this,"之前有申请权限,但是被拒绝",Toast.LENGTH_SHORT).show();    }else{        Toast.makeText(MainActivity.this,"没有申请过权限,---运行这里",Toast.LENGTH_SHORT).show();    }    return;}startActivity(intent);



下面继续


如果你的应用程序没有所需要的权限,那么你必须要通过调用requestPermissions()方法来申请权限,该方法调用后,系统会立刻弹出权限申请询问对话框供供用户选择,在用户交互后,系统会立刻通过onRequestPermissionsResult()将结果返回给应用程序



Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + 10086));if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)        != PackageManager.PERMISSION_GRANTED) {        //没有该权限的时候调用    if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.CALL_PHONE)){        //如果之前有申请,但是被用户拒绝了,则返回true    }else{        //否则申请权限        //下面这句代码使得系统弹出对话框:要允许xxx程序打电话吗         ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);//第三个参数为请求码    }    return;}startActivity(intent);

用户可以选择拒绝或者同意,那怎么处理呢,请看

//请求结果返回(拒绝或者返回)@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    if (requestCode == 1) {        //grant:发放        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {            //用户允许打电话            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + 10086));            //下面这个是自动生成的(这里其实可以不用判断是否有该权限的了)            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {                return;            }            startActivity(intent);          }else{            //用户拒绝权限,如果被用户拒绝后,下次每次点击按钮的时候都会直接打印toast            Toast.makeText(MainActivity.this,"你已经拒绝该权限,如果需要继续使用该功能,请允许该权限",Toast.LENGTH_SHORT).show();        }    }}



或者可以在用户拒绝之后,再次点击按钮的时候弹出提示框提示

//判断权限的的方法private void requestPermission(Activity mActivity,Context mcontext, String permisstion, int requestCode){    if(Build.VERSION.SDK_INT<23)        return;    if(ActivityCompat.checkSelfPermission(mcontext,permisstion)!=PackageManager.PERMISSION_GRANTED){        if(ActivityCompat.shouldShowRequestPermissionRationale(mActivity,permisstion)){            //如果之前用户拒绝了,那现在就应该提示一下用户            new AlertDialog.Builder(mcontext).setCancelable(false).setTitle("提示").setMessage("你之前已经拒绝该权限").setNegativeButton("我知道了", new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialog, int which) {                    dialog.dismiss();                }            }).show();        }else{            //申请权限            ActivityCompat.requestPermissions(mActivity,new String[]{permisstion},requestCode);        }    }}




Andnroid的运行时权限大概如此,如果在项目中应该做更详细的考虑,比如判断Android的版本号是否是6.0,在用户拒绝之后,下次再次点击的时候,应该弹出一个提示框等等,大家慢慢去探究吧

原创粉丝点击