即使在运行时请求权限后,也会出现误报lint权限错误

Som*_*mar 8 java android android-permissions

我很难理解android使用的运行时权限方法.对于那些正在阅读本文的人,我不是在这里问"如何调用运行时权限"..如果尚未授予权限对话框,我可以显示权限对话框,甚至可以在片段中获取onRequestPermissionsResult().

用这个代码

 if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        FragmentCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, RQ_GET_LOCATION);
        Log.e("permission", "asking permission");
        return;
    }
   Log.e("permission", "permission already granted");
   accessLocation();
Run Code Online (Sandbox Code Playgroud)

获得结果 onRequestPermissionsResult

 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case RQ_GET_LOCATION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.e("permission", "onRequestPermissionsResult : permission granted, access location here");
                accessLocation();
            }
            else {
                Log.e("permission", "onRequestPermissionsResult : permission denied");
            }
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

里面的代码accessLocation()

 private void accessLocation()
{
    Log.e("permission", "accessing location permission");
    Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) {
        userDetail.setLat(String.valueOf(mLastLocation.getLatitude()));
        userDetail.setLat(String.valueOf(mLastLocation.getLongitude()));
    }
    else {
        if (!isLocationEnabled()) {
            mShowAlert();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好..我困扰的是,在我的accessLocation()方法中,我在网上得到假阳性错误

Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
Run Code Online (Sandbox Code Playgroud)

说的是

调用需要用户可能拒绝的权限:代码应明确检查权限是否可用(带checkPermission)或显式处理潜力SecurityException

我知道当你不检查许可时会出现这种情况.一旦我用方法注释方法就会出现此错误@SuppressWarnings("MissingPermission")

我不知道开发人员如何在他们的课堂上多次调用方法时实际处理这些错误.要么我必须使用@SuppressWarnings("MissingPermission") 或?(我不知道)

假设我请求权限,就像我在上面的第一个代码块中执行的权限>弹出权限对话框>用户授予权限>流程转到onRequestPermissionsResult并再次编写用于访问位置的代码,但这也会向我显示未检查权限的误报错误..

或者我正在做一些可怕的事情,或者我认为我误解了许可模型或者有一些皮棉的错误(我真的不认为这是问题)..

我已经调查了这个stackoverflow问题这个工作室的bug,但我不满意那里的答案.

请告诉我我做错了什么?

F43*_*d1r 2

首先:你没有做错任何事。您的代码将按预期工作。


我建议直接取消警告,因为它显然是错误的。


但是,如果您想满足 Lint 要求,则必须将代码重构为以下架构

void doSomething(){
    if(permission granted){
        //do stuff (directly in here, do not delegate this to other methods)
    }else{
        //request permission
    }
}

void onRequestPermissionsResult(...){
    if(permission granted){
        doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

是的,如果未提前授予许可,这将导致双重检查。是的,生成的代码很难阅读。但警告将会消失。

运行时权限系统很糟糕,我们对此无能为力。