java - 运行时权限应该采用相同的方法。如何正确处理?

标签 java android android-permissions

当我需要获取存储权限时,我只需一个方法,如下所示:

public boolean hasStoragePermission(Activity context, int requestCode){

        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                &&
                ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
            return false;
        }

        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                &&
                ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},requestCode);
            return false;
        }
        return true;
    }

现在我可以在需要时调用这个函数:

if(hasStoragePermission(context, requestCode){
     //do the work
 }

但如果是位置:

public boolean hasPermission(){
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED
            &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
        return false;
    }
    return true;
}

当我调用它时:

  public void read(final LocationSetter locationSetter) {
    if(!hasPermission()){return;}

    flpClient = LocationServices.getFusedLocationProviderClient(this);
    flpClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            locationSetter.processLocation(location);
        }
    });
}

它表示调用需要权限。这是为什么?

enter image description here

最佳答案

Lint 检查很强大,但它们并不是魔法。此 Lint 规则正在寻找您拥有用于检查运行时权限的代码的证据,但它没有看到它。

如果用 if-positive-do-work 方法替换 if-negative-then-return 方法,你可能会有更好的运气:

if (hasPermission()) {
  // TODO insert your fused location provider work here
}

或者,只是抑制此特定方法的 Lint 检查。 Android Studio 应该有一个快速修复方案。最后,Lint 规则可以帮助确保您做正确的事情,如果您确定自己做的是正确的事情,那么在这种情况下就不需要该 Lint 规则。

关于java - 运行时权限应该采用相同的方法。如何正确处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977124/

相关文章:

安卓权限: Perform task after user pressed "Allow"

java - 自动授予 Espresso UI 测试权限

android - AOSP Marshmallow 修改/设置默认权限

java - 在代码中更改 Android 设备名称

java - 如何避免在android中连续点击同一个按钮

android - CollapsingToolbarLayout 无法正常工作

android - getBuyIntentExtraParams 不存在?也就是如何使用第 6 版应用内结算 API?

java - 具有任意深度嵌套项目的 Recyclerview

java - 执行时间和处理时间波动

java - HashSet 是否在内部进行排序工作?