Android 6.0:调用“shouldShowRequestPermissionRationale”多少次?

时间:2016-06-16 05:05:05

标签: android android-6.0-marshmallow android-permissions

我最近开始开发android 6.0 - 运行时权限请求。

我想知道调用shouldShowRequestPermissionRationale()方法的次数。

这是我的代码:

 @Override
    protected void onResume() {
        super.onResume();

        if ((ContextCompat.checkSelfPermission(LaunchActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED)){

            dbOperation();

            if (NetworkUtil.isServiceReachable(this)){
                checkAppVersion();
            } else {
                startApplication();
            }

        } else {

            if (!ActivityCompat.shouldShowRequestPermissionRationale(LaunchActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                showMessageOKCancel("You need to allow access to Storage/Media for storing your Records.",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(LaunchActivity.this,new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                        PermissionConstants.WRITE_EXTERNAL_STORAGE_PERMISSION);
                            }
                        });
                return;

            }
           ActivityCompat.requestPermissions(LaunchActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PermissionConstants.WRITE_EXTERNAL_STORAGE_PERMISSION);
            return;
        }

    } 

在回调方法中,我这样做:

  @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
       // super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){

            case PermissionConstants.WRITE_EXTERNAL_STORAGE_PERMISSION:{
                if (grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){

                    dbOperation();
                    // Permission is granted Read and Write external storage.
                    if (NetworkUtil.isServiceReachable(this)){
                        checkAppVersion();
                    } else {
                        startApplication();
                    }

                }else {

                    if (!ActivityCompat.shouldShowRequestPermissionRationale(LaunchActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        showMessageOKCancel("You need to allow access to Storage/Media for storing your Records.",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        ActivityCompat.requestPermissions(LaunchActivity.this,new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                                PermissionConstants.WRITE_EXTERNAL_STORAGE_PERMISSION);
                                    }
                                });
                        return;
                    }else {

                        ActivityCompat.requestPermissions(LaunchActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PermissionConstants.WRITE_EXTERNAL_STORAGE_PERMISSION);

                    }
                    //break;
                }
            }
            break;
default:super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

在这种情况下。当用户拒绝权限而不选择don.t再次询问时,android会显示2次请求权限对话框,然后进入无限循环。

  1. 我想知道如果用户多次拒绝请求但未选中don't ask again复选框会发生什么?

  2. 如果用户选中don't ask again复选框并拒绝请求会怎样?

  3. 在这种情况下是否会调用shouldShowRequestPermissionRationale()方法?

    如果,多少次?

    如果为什么不呢?

    任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

  1. 如果用户多次拒绝请求而不选择不再询问复选框,则对于shouldShowRequestPermissionRationale(),您将始终为true。因此,开发人员决定在显示Rationale对话框后第二次显示权限请求对话框时,让用户使用Rationale对话框和权限请求对话框循环,或将其视为拒绝。

  2. 如果用户选中“不再询问”复选框并拒绝该请求,则对于shouldShowRequestPermissionRationale(),即用户拒绝该权限,您将收到错误。

  3. 所以建议的流程应该是: -

    1. 在申请开始时是否授予了自己的许可。如果被授予开始主要活动。
    2. 如果未授予,则显示权限请求对话框。
    3. 在onRequestPermissionsResult回调中,如果授予启动主要活动,请检查授予或拒绝的权限状态。
    4. 如果被拒绝,则检查shouldShowRequestPermissionRationale(),如果是,则显示Permission Rationale对话框,然后再显示Permission request对话框。
    5. 再次在onRequestPermissionsResult回调中,检查授予或拒绝的权限状态,如果被授予启动主要活动。
    6. 如果被拒绝,请重复步骤4.
    7. 如果用户选择了Never Ask Again,那么您将获得shouldShowRequestPermissionRationale()false,这意味着用户不希望允许权限,然后您可以决定权限是否重要,而不管哪个应用程序无法运行,然后显示相应的警报用户和停止应用程序或启动具有有限功能的应用程序。
    8. 如果用户没有选择Never Ask Again但拒绝,那么你将获得shouldShowRequestPermissionRationale()true,你必须决定是否再次显示Rationale对话框。
    9. 在此您可以选择,如果权限是这样的,如果该应用程序无法运行,则向用户显示相应的警报消息并停止应用程序或显示更多详细信息的基本原理以解释用户以允许该权限。
    10. 如果权限是这样的,如果没有该应用程序可以使用有限的功能运行,则显示主要活动或再次显示基本原理对话框。
    11. 除非用户选择永不再询问,否则拒绝,shouldShowRequestPermissionRationale()将始终返回true并且其开发人员决定是否再次显示Rationale对话框和权限对话框。