如何 nag\ask 用户启用权限直到用户授予权限

How to nag\ask user to enable permission until user gives it

我想提醒用户授予位置权限,因为位置是应用程序的一项关键功能。

我尝试检查 onResume 的权限,但效果不佳,用户可以在应用程序之间来回切换,权限对话框已经显示。 我正在考虑使用一个标志来知道显示了权限对话框,所以像这样:

public void onResume(...)
{
   if(!isDialogDisplayed) 
   {
     isDialogDisplayed = true;
     // check for permission here
   }
}

我需要在关闭对话框时将 isDialogDisplayed 设置为 false

我怀疑这是最好的方法,还有其他方法吗?

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! 

            } else {

                // permission denied, boo! 
               //Show dialog again
            }
            return;
        }
    }
}

在您的 MainActivity 的 onStart 方法中,运行此方法:

private void checkForPermissions() {
    if (ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                MY_PERMISSIONS_REQUEST_FINE_LOCATION);
    } else {
        initializeViews();
    }
}

initializeViews() 是为了让您的应用程序正常启动。

然后执行 onRequestPermissionsResult() 如下:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    if (requestCode == MY_PERMISSIONS_REQUEST_FINE_LOCATION) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            initializeFragments();
        } else {
            openAlertDialog();
        }
    } 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

MY_PERMISSIONS_REQUEST_FINE_LOCATION 是一个 final int 字段,在我的例子中是 100。这个值并不重要,只要你在两种方法中使用相同的变量.

如果用户不允许权限,openAlertDialog() 将被调用,在我的应用程序中是这样的:

private void openAlertDialog() {
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("This app requires your location to function!");
    alertDialogBuilder.setPositiveButton("Try again",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    checkForPermissions();
                }
            });

    alertDialogBuilder.setNegativeButton("Settings", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            i.addCategory(Intent.CATEGORY_DEFAULT);
            i.setData(Uri.parse("package:dk.redweb.intern.findetlokum"));
            startActivity(i);
        }
    });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
}

此方法会生成一个对话框 window,用户可以在其中选择是再次获取权限请求,还是打开应用程序的“设置”菜单。当用户returns从“设置”进入应用程序时,将再次调用onStart以检查是否已授予权限。