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

时间:2016-03-16 05:02:20

标签: android permissions

Android 6.0中的Android运行时权限(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;
        }
    }

android

提供的最佳做法

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

说明以下

1)考虑使用意图

2)只询问你需要的权限

3)不要压倒用户

4)解释你为什么需要权限

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

然而这些最佳做法并未说明许可的频率,即说明需要显示这些权限的次数,还是只能显示一次

现在我面临的问题是

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

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

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

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

1 个答案:

答案 0 :(得分:5)

1)您引用的文档说:

  

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

这就是你每次都要求它的原因。

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

3)是的,这就是上面引用的内容。

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