2016-10-30 4 views
0

Я реализовал запрос разрешений в Runtime, но я не уверен, когда могу вызвать метод, который нуждается в разрешениях.Полученные разрешения Обработка событий на уровне API Android> = 23

Невозможно вызвать метод немедленно, потому что пользователю требуется время для нажатия кнопки «Да» в диалоговом окне разрешения.

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

Как с этим бороться?

Смотрите мой код, например

private void startBuildInCameraActivity(View v) { 

    if ((ContextCompat.checkSelfPermission(getActivity(), 
      Manifest.permission.CAMERA) 
      != PackageManager.PERMISSION_GRANTED) || 
      (ContextCompat.checkSelfPermission(getActivity(), 
        Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED)) { 
     requestPermissions(); 


     //TODO init onPermissionObtained event handler here instead "return" 
     return; 
    } 

    startCamera(); 
} 

Проблема заключается в том Пользователь должен позвонить startBuildInCameraActivity дважды, если он не имеет права. В противном случае startCamera() никогда не будет вызываться.

+1

Вы должны называть 'startCamera()' в вашем методе 'startBuildInCameraActivity()' в случае, если вам нужны разрешения, или в 'onRequestPermissionsResult()', когда предоставляется разрешение, которое происходит асинхронно. Если вы пропустили это, есть хорошая статья [https://developer.android.com/training/permissions/requesting.html) о разрешениях времени выполнения. – Drez

ответ

0

Спасибо, @Drez 21. Решение сделать класс реализован FragmentCompat.OnRequestPermissionsResultCallback, а затем:

private void startBuildInCameraActivity(View v) { 

    if ((ContextCompat.checkSelfPermission(getActivity(), 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED)) { 
     requestPermissions(); 
    } else { 
     startCamera(); 
    } 
} 

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

    if (grantResults.length != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
     ErrorDialog.newInstance(getString(R.string.permissions_needs)) 
       .show(getChildFragmentManager(), FRAGMENT_DIALOG); 
    } else { 
     startCamera(); 
    } 
} 

This class уже реализовал это поведение - использовать его, например.