如何nag \要求用户在用户提供权限之前启用权限

时间:2017-09-06 08:55:33

标签: android android-permissions

我想唠叨用户授予位置权限,因为位置是应用的关键功能。

我尝试检查onResume是否允许,但是没有给出好的结果,用户可以在应用程序和权限对话框之间来回切换已经可以显示。 我想用一个标志来知道显示权限对话框,如下所示:

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

当对话框被解除时,我需要将isDialogDisplayed设置为false

我怀疑这是做到这一点的最佳方式,还有其他方法吗?

2 个答案:

答案 0 :(得分:4)

在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 是一个最终的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();
}

此方法创建一个对话窗口,用户可以在再次获取权限请求或打开应用程序的“设置”菜单之间进行选择。当用户从“设置”返回应用程序时,将再次调用onStart以检查是否已授予该权限。

答案 1 :(得分:1)

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