Автоматическое определение для отображения разрешенного разрешения после отказа пользователя при первом запросе

#android #permissions #android-6.0-marshmallow

#Android #разрешения #android-6.0-marshmallow

Вопрос:

Я работаю с приложением Android в Android M и мне нужны некоторые разрешения, позволяющие получать доступ к CAMERA , RECORD_AUDIO , WRITE_EXTERNAL_STORAGE , … поэтому я проверяю свои разрешения, когда пользователь открывает приложение в первый раз. Но если пользователь отрицает это, как я могу автоматически определить, что пользователь использует функцию, для которой требовалось разрешение, а затем запросить их снова? Или я должен указать свое условие в каждой функции, требующей разрешения.

Я знаю, что когда мы используем какую-либо функцию, которая требует разрешения, но уже не разрешена, это вызовет исключение, так есть ли у нас какой-либо класс, который обрабатывает эту задачу?

Комментарии:

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

2. Переопределите это onRequestPermissionsResult().

3. Итак, если у нас нет какого-либо класса, который автоматически запускается при использовании пользователем функции, требующей разрешения, верно??

Ответ №1:

Я использую эту логику: каждое действие расширяет BaseActivity, в котором есть метод, который проверяет разрешения при каждом вызове onCreate ().

Метод, который я использую, это:

 public static boolean hasPermissions(Context context, String... permissions) {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M amp;amp; context != null amp;amp; permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }
  

Итак, каждый раз, когда пользователь запускает новое действие, приложение проверяет разрешения и отображает, какие разрешения еще не предоставлены.

Чтобы управлять результатом, используйте onRequestPermissionsResult()

Кстати, эта логика запросит у пользователя разрешение, даже если функция activity не требует никакого разрешения.

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

Ответ №2:

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

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

    if (requestCode == REQUEST_CAMERA) {
        // BEGIN_INCLUDE(permission_result)
        // Received permission result for camera permission.
        Log.i(TAG, "Received response for Camera permission request.");

        // Check if the only required permission has been granted
        if (grantResults.length == 1 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Camera permission has been granted, preview can be displayed
            Log.i(TAG, "CAMERA permission has now been granted. Showing preview.");
            Snackbar.make(mLayout, R.string.permision_available_camera,
                    Snackbar.LENGTH_SHORT).show();
        } else {
            Log.i(TAG, "CAMERA permission was NOT granted.");
           // Ask again for permission
        }
        // END_INCLUDE(permission_result)

    } else if (requestCode == REQUEST_CONTACTS) {
        Log.i(TAG, "Received response for contact permissions request.");

        // We have requested multiple permissions for contacts, so all of them need to be
        // checked.
        if (PermissionUtil.verifyPermissions(grantResults)) {
            // All required permissions have been granted, display contacts fragment.
            Snackbar.make(mLayout, R.string.permision_available_contacts,
                    Snackbar.LENGTH_SHORT)
                    .show();
        } else {
            Log.i(TAG, "Contacts permissions were NOT granted.");
           // Ask again for permission
        }

    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
  

Комментарии:

1. Итак, если у нас нет какого-либо класса, который автоматически запускается при использовании пользователем функции, требующей разрешения, верно??

2. Если у вас есть такой класс, который требовал этих разрешений, инициализируйте этот класс из onRequestPermissions при предоставлении

3. Например, у вас есть одна служба, которую вы используете для чтения контактов, затем запустите запись кода службы внутри if (grantResults. длина == 1 amp;amp; grantResults [0] == PackageManager. PERMISSION_GRANTED) { }