Разрешение на время работы Зефира

Такой новой и удивительной функциональностью безопасности является разрешение RUN-TIME

Я пытаюсь понять это и сделать одно демо для этого. Но один вопрос поднимает в моем сознании, что, когда я нахожусь с разрешения пользователя с DIALOG.

Как обращаться с « Никогда не спрашивайте снова »

Введите описание изображения здесь

Предположим, что мое приложение ДОЛЖНО нуждаться в местонахождении / контакте, но пользователь DENY его с «НИКОГДА НЕ СМОЖЕТСЯ СНОВА».

Что я могу сделать для этого. Не все Пользователь понимает, что мое поле не требуется.

ЛЮБОЕ ПРЕДЛОЖЕНИЕ?

Solutions Collecting From Web of "Разрешение на время работы Зефира"

Сначала вам нужно реализовать OnRequestPermissionsResultCallback Listener класса ActivityCompat в вашей Activity и переопределить void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) Способ проверки того, разрешает или запрещает ли Пользователь разрешение

Вы можете это сделать. Здесь я проверяю доступ к разрешениям для WRITE_EXTERNAL_STORAGE :

 int REQUEST_STORAGE = 1; private void checkPermissions() { if (hasStoragePermissionGranted()) { // you can do whatever you want } else { requestPermission(); } } public boolean hasPermissionGranted(){ return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } public void requestPermission() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE); } } 

Здесь onRequestPermissionsResult() метод onRequestPermissionsResult() , когда пользователь разрешает или запрещает разрешение на разрешение из окна Runtime.

Вы также можете справиться с ситуацией, когда пользователь установил флажок никогда не показывать диалоговое окно Runtime Permission, для которого вы можете показать Snackbar или кнопку, чтобы перенаправить пользователя на страницу настроек вашего приложения, так как вы не можете отобразить диалоговое окно разрешения после того, как пользователь установил флажок "Never ask again" .

 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_STORAGE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //Storage permission is enabled canSendAttachments = true; systemLogsCheckbox.setEnabled(true); } else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //User has deny from permission dialog Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"), Snackbar.LENGTH_INDEFINITE) .setAction("OK", new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE); } }) .show(); } else { // User has deny permission and checked never show permission dialog so you can redirect to Application settings page Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"), Snackbar.LENGTH_INDEFINITE) .setAction("OK", new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null); intent.setData(uri); startActivity(intent); } }) .show(); } } } 

Здесь я использовал Snackbar чтобы показать релевантное сообщение для пользователя о Permission, а mainLayout – это идентификатор Activity's Main Layout .

Надеюсь, это поможет вам.

Я создал library которая обрабатывает все permissions для вас. Вы можете найти его здесь:

PermissionHelper


Чтобы ответить на ваш вопрос:

Для того, чтобы вы знали, что пользователь checked никогда не будет отображаться снова, вам придется проверять две вещи, если разрешение declined и никаких explanation needed если эти два возвращаются **true** что означает, что разрешение больше не доступно Для повторного запроса, и единственным решением для обработки этого случая является открытие экрана настроек.

PS: библиотека, которую я создал, обрабатывает все эти сценарии для вас и возвращает обратные вызовы для вас, чтобы решить, что делать дальше !. Библиотека имеет две реализации

  1. Ручная реализация (что означает, что вам придется реализовать обратный вызов в своей деятельности и прослушать возвращенный обратный вызов из библиотеки).
  2. Позвольте библиотеке запросить разрешение для вас, и оно также вернет вам обратный вызов, чтобы вы могли решить, что произойдет, когда разрешение будет окончательно отклонено.

Откройте настройку своего приложения, когда пользователь выбрал «Nerver ask again»

 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, REQUEST_PERMISSION_SETTING); 

Мой пример для обработки RuntimePermission:
https://github.com/henrychuangtw/RuntimePermission

Шаг 1: использование библиотеки PermissionsDispatcher по hotchemi (библиотека основана на аннотациях, проста в использовании и хорошо документирована)

Шаг 2: вы должны предоставить 4 аннотированных метода, а один из них – @OnNeverAskAgain (Manifest.permission. [Permission_you_want]), как показано ниже

 @OnNeverAskAgain(Manifest.permission.[permission_you_want]) void showNeverAsk() { // handle here } 

Вот пример