当用户拒绝应用程序中的权限时怎么办?
How can do when the user reject permissions in the app?
我正在开发一个主要功能是在地图上查看数据的应用程序。
为此,我需要获取当前位置,为此,我向用户请求。
但是如果用户拒绝权限,再次请求权限的最佳方式是什么?
我尝试在 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.WhosebugError: stack size 8MB
谢谢
如果用户使用 "Never ask again" 选项拒绝权限,您的 onRequestPermissionsResult
方法将永远调用自身,直到它抛出 WhosebugError
.
这里最好的做法是一旦用户拒绝,就不要在 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,这是一个很好的指南。
Whosebug -> 这通常意味着您的代码中有递归调用。递归简单来说就是方法调用自己,导致栈溢出抛出Whosebug异常
如果用户拒绝权限,应用程序可能不会再次询问用户。那么这个流程就像一个无限循环。当你超过堆栈大小
时你会崩溃
如果用户拒绝权限意味着用户不想与您的应用共享 his/her 数据,那么您为什么要反复询问它,这对用户来说很烦人,您只需发一条消息让用户知道您为什么要请求许可,如果拒绝用户则无法使用该应用程序的特定功能,您仍然想反复请求许可,您只需要在用户拒绝时显示对话框并提示 "PLease allow this permission for further app use"
当用户再次按下 ok 显示权限对话框时。
我正在开发一个主要功能是在地图上查看数据的应用程序。
为此,我需要获取当前位置,为此,我向用户请求。
但是如果用户拒绝权限,再次请求权限的最佳方式是什么?
我尝试在 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.WhosebugError: stack size 8MB
谢谢
如果用户使用 "Never ask again" 选项拒绝权限,您的 onRequestPermissionsResult
方法将永远调用自身,直到它抛出 WhosebugError
.
这里最好的做法是一旦用户拒绝,就不要在 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,这是一个很好的指南。
Whosebug -> 这通常意味着您的代码中有递归调用。递归简单来说就是方法调用自己,导致栈溢出抛出Whosebug异常
如果用户拒绝权限,应用程序可能不会再次询问用户。那么这个流程就像一个无限循环。当你超过堆栈大小
时你会崩溃如果用户拒绝权限意味着用户不想与您的应用共享 his/her 数据,那么您为什么要反复询问它,这对用户来说很烦人,您只需发一条消息让用户知道您为什么要请求许可,如果拒绝用户则无法使用该应用程序的特定功能,您仍然想反复请求许可,您只需要在用户拒绝时显示对话框并提示 "PLease allow this permission for further app use" 当用户再次按下 ok 显示权限对话框时。