Держу вещи, пока я получаю разрешения - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть метод с именем getPermisions, который использует вспомогательный метод с именем hasPermissions. Я вызываю getPermissions () в методе onCreate следующим образом. , .

getPermissions();
//code here uses these permissions
camera = Camera.open();  //but this code executes async to getPermissions method

Код для getPermissions выглядит следующим образом. , .

private  boolean hasPermissions(Context context, String... permissions) {
    if (context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}
private void getPermissions()
{
    //before we display setup dialog we must get permissions . . .

            int PERMISSION_ALL = 1;
            String[] PERMISSIONS = {
                    android.Manifest.permission.READ_PHONE_STATE,
                    android.Manifest.permission.ACCESS_FINE_LOCATION,
                    android.Manifest.permission.CAMERA
            };

            if(!hasPermissions(this, PERMISSIONS)){
                ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
            }

}

Код работает отлично, если я иду по нему, но при фактическом запуске приложения код getPermissions () асинхронно запускается в потоке основного пользовательского интерфейса. Поэтому, когда я вызываю getPermissions (), основной поток продолжает работать с разрешениями, которые я все еще запрашиваю.

Мне нужно задержать основной поток, пока пользователь отвечает на все три диалоговых окна. Как лучше это сделать?

1 Ответ

0 голосов
/ 06 сентября 2018

Поэтому, когда я вызываю getPermissions (), основной поток продолжает работать с разрешениями, которые я все еще запрашиваю.

Ну, requestPermissions() работает асинхронно, если вы это имеете в виду. Под крышками используется startActivityForResult() для отображения предоставленного системой диалогового окна разрешений.

Мне нужно задержать основной поток, пока пользователь отвечает на все три диалоговых окна

Это невозможно. Вы никогда не получите диалоговое окно с разрешениями, не говоря уже о результате.

Это тоже не обязательно.

В двух словах:

  • Поместите ваш код, который опирается на эти разрешения, в методе
  • Вызовите этот метод, если hasPermissions() вернет true
  • Позвоните getPermissions(), если hasPermissions() вернет false
  • Вызовите этот метод из onRequestPermissionsResult(), если пользователь предоставил вам запрошенные разрешения

Если вам это не нравится, есть несколько десятков библиотек , которые стремятся предложить более простые шаблоны для использования разрешений во время выполнения. Возможно, один из них заинтересует вас.

Использование разрешений во время выполнения описано в документации .

...