Android动态权限

Android6.0权限分为了两种,一种是普通权限,一种是危险权限
而我们要使用危险权限的时候,就需要动态申请了,而危险权限一共9组26种


Android动态权限_第1张图片

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


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


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


我在文件清单中配置:

android:name="android.permission.CALL_PHONE">

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

Android动态权限_第2张图片

我运行该程序到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);

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

//请求结果返回(拒绝或者返回)
@Override
public 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,在用户拒绝之后,下次再次点击的时候,应该弹出一个提示框等等,大家慢慢去探究吧

你可能感兴趣的:(Android炼气)