Android 6.0 中的 Android 运行时权限(API 级别 23)最佳做法



Android 6.0 中的运行时权限(API 级别 23)最佳做法

我已成功

使用

这些参考

http://developer.android.com/training/permissions/requesting.html

https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

这是我使用的代码

private static final int PERMISSION_REQUEST_CODE = 1;
    switch (id){
                case R.id.check_permission:
                    if (checkPermission()) {
                        Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show();
                    } else {
                        Snackbar.make(view,"Please request permission.",Snackbar.LENGTH_LONG).show();
                    }
                    break;
                case R.id.request_permission:
                    if (!checkPermission()) {
                        requestPermission();
                    } else {
                        Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show();
                    }
                    break;
            }
private boolean checkPermission(){
        int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }
    private void requestPermission(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.ACCESS_FINE_LOCATION)){
            Toast.makeText(context,"GPS permission allows us to access location data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSION_REQUEST_CODE);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show();
                } else {
                    Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show();
                }
                break;
        }
    }

安卓提供的最佳实践

http://developer.android.com/training/permissions/best-practices.html

陈述以下内容

1) 考虑使用意图

2)只请求您需要的权限

3)不要让用户不知所措

4) 解释为什么需要权限

现在按照上述内容,我们仅在需要时请求权限,并且仅针对该活动所需的特定权限

但是,这些

最佳实践并没有说明权限的频率,即说这些权限需要显示多少次,或者只能显示一次

现在我面临的问题是

1)每次在应用程序中调用活动时,都会弹出权限,这些发生在应用程序使用的特定会话中(如果在同一会话期间调用相同的活动,则一旦授予权限,就不会调用权限)

2)我们是否可以存储已授予的权限(即在共享首选项中执行第一次检查的静态变量,以便不会一次又一次地调用权限)

3)我们是否需要在每次使用应用程序时调用权限访问权限

4)如果不允许共享首选项,我们如何更优雅地管理这些权限

1)您引用的文档说:

如果您的应用需要危险权限,您必须检查您是否 每次执行需要的操作时都具有该权限 该许可。用户始终可以自由撤销权限,因此 即使该应用程序昨天使用了相机,它也不能假设它仍然 今天有这个权限。

这就是为什么您每次都必须请求它的原因。

2) 您无法存储权限。 Android 决定记住已授予权限的时间。

3)是的,这就是上面引用的意思。

4)您让Android管理权限。除了在需要时检查或请求它们外,您自己不做任何事情。

最新更新