Предполагается, что разрешения времени выполнения должны быть в том же методе.Как правильно с этим справиться? - PullRequest
0 голосов
/ 10 июля 2019

Когда мне нужно получить разрешение на хранение, у меня просто есть метод, такой как:

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);
        }
    });
}

Это говорит, что Call requires permission.Это почему?

enter image description here

1 Ответ

0 голосов
/ 10 июля 2019

Проверки ворса сильны, но они не волшебны. Это правило Lint ищет доказательства того, что у вас есть код для проверки разрешений во время выполнения, и он его не видит.

Вполне возможно, что вам повезет больше, если вы замените подход «если отрицательный, то потом вернет» подходом «если положительный, сделайте»:

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

Или просто отключите проверку Lint для этого конкретного метода. Это должно быть быстрое исправление, доступное в Android Studio. В конце концов, существует правило Lint, помогающее убедиться, что вы поступаете правильно, и если вы уверены, что поступаете правильно, в этом случае вам не нужно это правило Lint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...