我正在开发一个应用程序,其主要功能是在地图上查看数据。
为此,我需要获取当前位置,为此,我向用户请求。
但是,如果用户拒绝权限,再次询问它的最佳方式是什么?
我尝试在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
谢谢
如果用户拒绝了“永不再问”选项的权限,那么你的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的更多信息,这是一个很好的指南。
StackOverflow - >这通常意味着您在代码中进行了递归调用。递归只是一个调用自身的方法,导致堆栈溢出并抛出StackOverflow异常。
如果用户拒绝许可,可能应用程序不会再向用户询问。然后这个流程就像一个无限循环。当你超过堆栈大小时,你会崩溃
如果用户拒绝权限意味着用户不想与您的应用程序共享他/她的数据,那么为什么您要反复询问它,这对用户来说很烦人,您只需发出消息让用户知道您为什么要求权限和如果拒绝用户无法使用应用程序的特定功能,仍然要反复请求权限,只需要在用户拒绝时显示对话框,提示“PLease允许此权限以进一步使用应用程序”并且当用户按下确定时再次显示权限对话框。