#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) { }