如何 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以检查是否已授予权限。
我想提醒用户授予位置权限,因为位置是应用程序的一项关键功能。
我尝试检查 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以检查是否已授予权限。