我想唠叨用户授予位置权限,因为位置是应用的关键功能。
我尝试检查onResume
是否允许,但是没有给出好的结果,用户可以在应用程序和权限对话框之间来回切换已经可以显示。
我想用一个标志来知道显示权限对话框,如下所示:
public void onResume(...)
{
if(!isDialogDisplayed)
{
isDialogDisplayed = true;
// check for permission here
}
}
当对话框被解除时,我需要将isDialogDisplayed
设置为false
。
我怀疑这是做到这一点的最佳方式,还有其他方法吗?
答案 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;
}
}
}