当用户拒绝应用程序中的权限时怎么办?

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 显示权限对话框时。