我正在开发一个应用程序,其主要功能是在地图上查看数据。
为此,我需要获取当前职位,并为此向用户请求。
但是,如果用户拒绝该权限,最好的再次询问方式是什么?
我尝试在onRequestPermissionsResult
中再次询问,但应用程序崩溃。
有什么主意吗?
代码:
private void enableMyLocationIfPermitted() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
if (mapViewModel.getGoogleMap() != null) {
mapViewModel.getGoogleMap().setMyLocationEnabled(true);
} else {
Log.e(TAG, "No Google Map available in view model");
}
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.d(TAG, "Map is ready");
googleMap.setOnMarkerClickListener(this);
googleMap.getUiSettings().setRotateGesturesEnabled(false);
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
mapViewModel.setGoogleMap(googleMap);
enableMyLocationIfPermitted();
getLastLocationIfPermitted();
mapViewModel.loadData();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case LOCATION_PERMISSION_REQUEST_CODE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
enableMyLocationIfPermitted();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
Toast.makeText(this, getResources().getText(R.string.you_need_permissions), Toast.LENGTH_LONG).show();
}
return;
}
}
}
错误:
java.lang.StackOverflowError:堆栈大小8MB
谢谢
答案 0 :(得分:2)
如果用户通过“不再询问”选项拒绝了权限,则您的onRequestPermissionsResult
方法将永远调用自身,直到抛出StackOverFlowError
。
这里最好的做法是,一旦用户拒绝,就不要在onRequestPermissionsResult
方法中再次请求权限。相反,您可以禁用该功能,也可以打开应用程序的权限设置,并使用以下代码让他们手动更改权限设置。
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case LOCATION_PERMISSION_REQUEST_CODE: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
enableMyLocationIfPermitted();
} else {
Toast.makeText(this, getResources().getText(R.string.you_need_permissions), Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
return;
}
}
}
如果您想了解有关权限https://developer.android.com/training/permissions/requesting的更多信息,这是一个很好的指南。
答案 1 :(得分:2)
StackOverflow ->这通常意味着您在代码中有一个递归调用。递归只是调用自身的一种方法,导致堆栈溢出并引发StackOverflow异常。
应用程序可能不会再次询问用户是否拒绝了权限。然后,该流的行为就像一个无限循环。当您超过堆栈大小时,您将会崩溃
答案 2 :(得分:1)
如果用户拒绝许可意味着用户不想与您的应用共享他/她的数据,那么为什么要反复询问,这对用户来说很烦人,您只需要简单地输入一条消息,让用户知道您为什么询问权限,并且在拒绝用户无法使用该应用程序的特定功能的情况下,您仍然想重复请求权限,当用户拒绝时,只需显示对话框,提示“请允许此权限以进一步使用该应用程序” 当用户再次按ok时,显示权限对话框。