Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Сначала вам нужно реализовать 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() будет вызываться метод, когда пользователь разрешает или запрещает разрешение на разрешение из окна 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, чтобы показать релевантное сообщение пользователю о Разрешении, а mainLayout - id от Activity Main Layout.

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

Ответ 2

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

PermissionHelper


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

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

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

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

Ответ 3

откройте настройку своего приложения, когда пользователь выбрал "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

Ответ 4

Используйте Dexter библиотека

или

Использовать PermissionsDispatcher:

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

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

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

Вот sample