Решение ошибки: SecurityException и SEND_SMS в Android
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Невероятно важно помнить, что начиная с Android 6.0+ (API 23+) следует применять ContextCompat.checkSelfPermission
для проверки разрешения и ActivityCompat.requestPermissions
для запроса разрешений во время работы приложения:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Обратимся за разрешением к системе Android на использование камеры
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
Замените CAMERA на необходимое вам разрешение и обязательно обработайте результат в onRequestPermissionsResult
.
Опасно? Не в моём часу!
Разрешения Android делятся на обычные и опасные. И в чём здесь суть: при работе с API 23 (Android 6.0) и выше, для получения opасных разрешений требуется подтверждение пользователя во время выполнения.
Три этапа получения разрешений во время выполнения
Разберём процесс получения разрешений:
- Проверьте наличие разрешения через:
ContextCompat.checkSelfPermission
. - Если разрешение не предоставлено, запросите его:
ActivityCompat.requestPermissions
. - Узнайте решение пользователя и обработайте его в
onRequestPermissionsResult
.
Не забывайте, что пользователь имеет право отказать в предоставлении разрешения. В таком случае ваша задача — спокойно отнестись и соответствующим образом отреагировать.
Анализ типичных ошибок и способы их решения
- Проверьте, не допустили ли вы ошибок в написании названия разрешения: исправьте тег
<uses-permission/>
в вашем manifest file. - Изменение
targetSdkVersion
чтобы избегать запросов разрешений для API ниже 23 – это далеко не лучшее решение. Будьте честны! - Встречаетесь с исключениями безопасности? Используйте отладочные сообщения, чтобы выяснить, где была пропущена проверка разрешения.
Визуализация
Когда слова уже не спасают, помогает визуализация:
Ваше приложение – это соискатель на работу (👤), а операционная система Android – это офис (🚪).
💬 Вы заявиили о своих навыках в AndroidManifest.xml:
"Привет, я пришёл на собеседование (👤 ➡️ 🚪)!"
[🗒️ Разрешение объявлено]
🚫 Но охрана не пускает вас внутрь...
"Почему?"
[🚪 Разрешение не получено]
🔑 Затем вы получаете разрешение через настройки приложения или в процессе работы:
[👤 Запрос доступа] ➡️ [✅ Разрешение предоставлено] ➡️ [👤 Входит в офис (🚪 Дверь открыта)]
Суть в следующем: Чтобы проходить собеседование, недостаточно просто иметь навыки (объявленные разрешения). Надо получить явное согласие пользователя во время работы приложения, чтобы открыть дверь и получить желаемую функциональность.
При разработке под API 23+ каждое опасное разрешение требует явного подтверждения от пользователя.
Подробно о разрешениях во время выполнения
Ясность в перманентных значениях
Используйте константы как PackageManager.PERMISSION_GRANTED
и PackageManager.PERMISSION_DENIED
, чтобы ваш код был чётким и понятным.
Навигация по версиям Android
Чтобы подстроить приложение под различные версии Android, используйте Build.VERSION.SDK_INT
, что даст вам понять, нужно ли и как выполнить проверку разрешений.
Параллельный запрос разрешений
Нужно запросить несколько разрешений сразу? Сделайте это одновременно, передавая массив String[]
в requestPermissions
.
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.SEND_SMS,
Manifest.permission.ACCESS_FINE_LOCATION
}, PERMISSIONS_MULTIPLE_REQUEST);
Совет дня – работа с SEND_SMS
Если нужно взаимодействовать с разрешением SEND_SMS, не забудьте запросить его как Manifest.permission.SEND_SMS
, и только после получения разрешения вы сможете отправлять СМС, словно романтические письма давних времен.
Полезные материалы
- Permissions on Android | Android Developers — всё необходимое про систему разрешений Android.
- Request runtime permissions | Android Developers — детальное руководство о запросе разрешений во время выполнения приложения.
- Runtime Permissions in Android 6.0 Marshmallow (Android Development Patterns Ep 3) – YouTube — доступное видео о системе разрешений в Android.
- Understanding App Permissions | CodePath Android Cliffnotes — введение в функционирование и управление разрешениями приложений на Android.
- The Android permissions model – Tutorial — пошаговое руководство Vogella по разрешениям в Android.