美文网首页
Android 6.0(API 级别 23)在运行时请求权限

Android 6.0(API 级别 23)在运行时请求权限

作者: _春夏秋冬 | 来源:发表于2018-09-06 14:19 被阅读0次

运行时请求权限

好处:
1)简化应用安装过程,因为用户在安装或更新应用时不需要授予权限;
2)让用户可以对应用的功能进行更多控制。

权限分类:正常权限 + 危险权限(会授予应用访问用户机密数据的权限)
一下图片是官方文档总结的10组26种危险权限。

permissions.PNG

所有Android版本中,都需要在应用清单中同时声明它需要的正常权限和危险权限。声明权限会在不同的Android版本中有所差异。

  1. 低版本SDK为22或更低,如果您在清单中列出了危险权限,则用户必须在安装应用时授予权限;如果他们不授予此权限,系统根本不会安装应用。
  2. 高版本SDK为23或更高,应用必须在清单中列出权限,并且在运行时请求其需要的没想危险权限。用户可以授予或拒绝每项权限。即使用户拒绝权限请求,应用仍可以继续运行有限的功能。

步骤:

  1. 检查权限
  2. 请求权限
  3. 处理权限请求响应



如下图是ContextCompat类的用来检查权限的方法,第二个参数传Manifest.permission.WRITE_EXTERNAL_STORAGE类似这样的值。返回值由两种。PackageManager.PERMISSION_DENIED和PackageManager.PERMISSION_GRANTED。

checkSelfPermission.PNG



如下图是ActivityCompat类用来解释应用为什么需要权限的方法,初次使用时返回值时false,当用户拒绝权限再次点击的时候,返回值是true。


shouldShow.PNG

如下图是ActivityCompat类用来请求权限的方法


requestPermissions.PNG

onRequestPermissionsResult回调方法

{

    public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
            TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider


    public class FragmentActivity extends BaseFragmentActivityApi16 implements
            ViewModelStoreOwner,
            ActivityCompat.OnRequestPermissionsResultCallback,
            ActivityCompat.RequestPermissionsRequestCodeValidator

}

以上代码可以看出Activity已经实现了ActivityCompat.OnRequestPermissionsResultCallback接口。

@TargetApi(Build.VERSION_CODES.M)
private void checkPermission() {
    int checkSelfPermission = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {
        boolean b = ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        Log.d(TAG, "checkPermission: b = " + b);
        //首次为false,用户拒绝之后为true
        if (b) {
            new AlertDialog.Builder(this)
                    .setMessage("申请权限")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 请求您需要的权限
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                    REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
                        }
                    })
                    .create()
                    .show();
        } else {
            // 请求您需要的权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
        }
    } else if (checkSelfPermission == PackageManager.PERMISSION_GRANTED) {
        write();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            write();
        }
    }
}

官方文档:在运行时请求权限
Android 6.0及运行时权限处理
Android 6.0运行时权限详解

相关文章

网友评论

      本文标题:Android 6.0(API 级别 23)在运行时请求权限

      本文链接:https://www.haomeiwen.com/subject/tpcxgftx.html