Решение ошибки: SecurityException и SEND_SMS в Android

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Невероятно важно помнить, что начиная с Android 6.0+ (API 23+) следует применять ContextCompat.checkSelfPermission для проверки разрешения и ActivityCompat.requestPermissions для запроса разрешений во время работы приложения:

Java
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Опасно? Не в моём часу!

Разрешения Android делятся на обычные и опасные. И в чём здесь суть: при работе с API 23 (Android 6.0) и выше, для получения opасных разрешений требуется подтверждение пользователя во время выполнения.

Три этапа получения разрешений во время выполнения

Разберём процесс получения разрешений:

  1. Проверьте наличие разрешения через: ContextCompat.checkSelfPermission.
  2. Если разрешение не предоставлено, запросите его: ActivityCompat.requestPermissions.
  3. Узнайте решение пользователя и обработайте его в onRequestPermissionsResult.

Не забывайте, что пользователь имеет право отказать в предоставлении разрешения. В таком случае ваша задача — спокойно отнестись и соответствующим образом отреагировать.

Анализ типичных ошибок и способы их решения

  • Проверьте, не допустили ли вы ошибок в написании названия разрешения: исправьте тег <uses-permission/> в вашем manifest file.
  • Изменение targetSdkVersion чтобы избегать запросов разрешений для API ниже 23 – это далеко не лучшее решение. Будьте честны!
  • Встречаетесь с исключениями безопасности? Используйте отладочные сообщения, чтобы выяснить, где была пропущена проверка разрешения.

Визуализация

Когда слова уже не спасают, помогает визуализация:

Markdown
Скопировать код
Ваше приложение – это соискатель на работу (👤), а операционная система Android – это офис (🚪).
Markdown
Скопировать код
💬 Вы заявиили о своих навыках в AndroidManifest.xml:

"Привет, я пришёл на собеседование (👤 ➡️ 🚪)!"

[🗒️ Разрешение объявлено]
Markdown
Скопировать код
🚫 Но охрана не пускает вас внутрь...

"Почему?"

[🚪 Разрешение не получено]
Markdown
Скопировать код
🔑 Затем вы получаете разрешение через настройки приложения или в процессе работы:

[👤 Запрос доступа] ➡️ [✅ Разрешение предоставлено] ➡️ [👤 Входит в офис (🚪 Дверь открыта)]

Суть в следующем: Чтобы проходить собеседование, недостаточно просто иметь навыки (объявленные разрешения). Надо получить явное согласие пользователя во время работы приложения, чтобы открыть дверь и получить желаемую функциональность.

При разработке под API 23+ каждое опасное разрешение требует явного подтверждения от пользователя.

Подробно о разрешениях во время выполнения

Ясность в перманентных значениях

Используйте константы как PackageManager.PERMISSION_GRANTED и PackageManager.PERMISSION_DENIED, чтобы ваш код был чётким и понятным.

Навигация по версиям Android

Чтобы подстроить приложение под различные версии Android, используйте Build.VERSION.SDK_INT, что даст вам понять, нужно ли и как выполнить проверку разрешений.

Параллельный запрос разрешений

Нужно запросить несколько разрешений сразу? Сделайте это одновременно, передавая массив String[] в requestPermissions.

Java
Скопировать код
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, и только после получения разрешения вы сможете отправлять СМС, словно романтические письма давних времен.

Полезные материалы

  1. Permissions on Android | Android Developers — всё необходимое про систему разрешений Android.
  2. Request runtime permissions | Android Developers — детальное руководство о запросе разрешений во время выполнения приложения.
  3. Runtime Permissions in Android 6.0 Marshmallow (Android Development Patterns Ep 3) – YouTube — доступное видео о системе разрешений в Android.
  4. Understanding App Permissions | CodePath Android Cliffnotes — введение в функционирование и управление разрешениями приложений на Android.
  5. The Android permissions model – Tutorial — пошаговое руководство Vogella по разрешениям в Android.