【问题标题】:How to change denied/granted permission in Android M?如何更改 Android M 中的拒绝/授予权限?
【发布时间】:2016-09-15 12:18:23
【问题描述】:

我怎样才能让用户有机会在应用程序中更改他的权限, 他已经设置为授予/拒绝?

假设用户拒绝了权限。后来他想授予这个权限。 可能吗?我该怎么做?

【问题讨论】:

  • 如果用户选择显示从不,那么他/她只需要从设置中更改它,否则我们可以应用代码来检查每次用户访问该活动时的权限
  • 机制相同;您应该存储被拒绝的权限,并使用相同的方法询问。
  • 当您执行某些需要 PERMISSION 的操作时,您必须检查该权限是否有用户授予该权限。如果当时不是,您必须再次请求该许可。直到用户授予该权限,用户才能执行该特定任务。

标签: android permissions


【解决方案1】:

如果用户拒绝了该权限,您可以检查该权限,如果他也检查过不再显示,在这种情况下,您可以打开自己的对话框,说明您的应用需要该权限,并从该对话框中您可以将用户带到应用设置,如果他愿意,他可以在其中允许权限。

public static void checkPermissionForExternalStorage(final Context mContext) {

    if (Build.VERSION.SDK_INT >= 23) {

        int writeExternalStorage = ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (writeExternalStorage != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSIONS_FOR_STORAGE);
            return;
        }

        //Do your stuff

    } else {

       //Do your stuff
    }
}



 public static void startInstalledAppDetailsActivity(Context mContext) {

    Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + mContext.getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    mContext.startActivity(i);
}



   @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    switch (requestCode) {



        case REQUEST_CODE_ASK_PERMISSIONS_FOR_STORAGE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //Do your stuff
            } else {
                // Permission Denied

                if (!ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    showMessageOKCancel("The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission. Tap Settings > Permissions, and turn Storage on.",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    startInstalledAppDetailsActivity((Activity) mContext);
                                }
                            });
                }


                Toast.makeText( mContext, "Write to external storage permission request denied.", Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

【讨论】:

  • 现在很好用。谢谢!哇,我看到你添加了代码。这太棒了。
【解决方案2】:

您向用户显示一个对话框,要求转到应用程序设置并更改那里的权限,您必须以某种方式激励他,说明您为什么需要该权限。然后你放了一个“打开设置”按钮来触发以下功能:

private void startInstalledAppDetailsActivity() {
    final Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    startActivity(i);
}

【讨论】:

  • 感谢您的回答! :)
【解决方案3】:

有多种方法可以实现您的目标:

  1. 您可以为此目的创建一个单独的视图/片段,以获取您的应用所需的所有权限,您可以从那里调用requestPermission()

  2. 或者您可以在用户打开需要运行权限的应用程序段时通过调用requestPermission() 简单地提示用户权限。

  3. 用户还可以从Settings 向应用授予权限。因此,如果用户希望通过Settings 稍后更改权限,指导用户(例如通过对话框)可能是一个好主意。

【讨论】:

    【解决方案4】:

    是的,您可以这样做。

    如果onRequestPermissionsResult 有回调,您可以在其中了解用户是否已授予权限。如果用户未授予权限,您可以在需要时再次请求相同的权限。

    【讨论】:

    • @lodox 我的答案与您接受的答案相同。但是我故意没有放任何代码供您学习。但是,如果您期望用勺子喂食,那也没关系。祝你好运
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2016-03-16
    • 2011-10-17
    • 2012-01-19
    • 2011-08-28
    • 2019-03-10
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多