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

时间:2019-03-13 10:49:26

标签: android android-permissions android-maps

我正在开发一个应用程序,其主要功能是在地图上查看数据。

为此,我需要获取当前职位,并为此向用户请求。

但是,如果用户拒绝该权限,最好的再次询问方式是什么?

我尝试在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

谢谢

3 个答案:

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