如何在Android M中更改拒绝/授予的权限?

时间:2016-09-15 12:18:24

标签: android permissions

如何让用户有机会在App中更改其权限, 他已经设定授予/拒绝?

让我们说用户拒绝了许可。后来他希望获得此许可。 可能吗?我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

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

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);
    }
}

答案 1 :(得分:1)

您向用户显示一个对话框,要求转到应用程序设置并更改其中的权限,您必须以某种方式激励他,告诉您为何需要该权限。并且你设置了一个“打开设置”按钮,它会触发以下功能:

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);
}

答案 2 :(得分:1)

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

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

  2. 或者,只要用户通过调用requestPermission()打开需要运行权限的应用细分,您就可以提示用户获取权限。

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

答案 3 :(得分:0)

是的,你可以这样做。

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