Ликбез по разрешениям в Android

от автора

В быстро меняющемся мире мобильных технологий операционная система Android занимает особое место благодаря своей универсальности и обширному спектру возможностей. Одним из ключевых элементов, обеспечивающих безопасность и неприкосновенность личных данных пользователей Android, является система разрешений. Разрешения Android контролируют взаимодействие приложений с операционной системой и доступ к пользовательским данным, создавая безопасную и контролируемую среду, в которой функциональность и защита находятся в гармонии.

Что это такое?

Разрешения в Android представляют собой набор прав, которые приложения должны запрашивать у пользователей, чтобы получить доступ к различным функциям и данным на устройстве. Эти разрешения охватывают широкий спектр возможностей, начиная от доступа к камере и микрофону и заканчивая чтением контактов и получением информации о местоположении. Система разрешений предназначена для защиты конфиденциальной информации пользователей и поддержания целостности операционной системы.

Эволюция разрешений в Android

С момента своего создания система разрешений Android претерпела значительные изменения, направленные на повышение безопасности и улучшение контроля со стороны пользователей. Ранние версии Android требовали от пользователей предоставлять все запрашиваемые приложением разрешения во время его установки, что часто приводило к тому, что пользователи неосознанно предоставляли чрезмерное количество разрешений. Осознав необходимость повышения прозрачности и контроля со стороны пользователей, Google ввела в Android 6.0 (Marshmallow) систему запроса разрешений во время выполнения. И это изменение действительно стало поворотным моментом в том, как пользователи воспринимают разрешения приложений и взаимодействуют с ними.

Типы разрешений

1. Обычные разрешения

Обычные (normal) разрешения — это набор разрешений, которые позволяют приложениям получать доступ к данным и функциям, представляющим минимальный риск для конфиденциальности пользователя и безопасности устройства. Эти разрешения открывают доступ к функционалу, необходимому приложению для выполнения основных операций, но не предполагают доступа к конфиденциальным данным пользователя или критическим функциям системы.

Примеры обычных разрешений:

  • INTERNET: позволяет приложениям открывать сетевые сокеты.

  • SET_WALLPAPER: позволяет приложениям устанавливать фоновое изображение на устройстве.

  • VIBRATE: позволяет использовать вибрацию в приложениях.

В отличие от опасных разрешений, обычные разрешения автоматически предоставляются системой во время установки. Пользователям не нужно явно предоставлять эти разрешения, и им не предлагается их одобрить. Такой подход был принят, потому что обычные разрешения не имеют значительного влияния на конфиденциальность или безопасность.

Как работают обычные разрешения

Когда приложению требуется обычное разрешение, оно должно быть объявлено в его файле AndroidManifest.xml. В процессе установки система Android проверяет разрешения, запрашиваемые приложением, и автоматически предоставляет их без какого‑либо вмешательства со стороны пользователя.

Вот как приложение может объявить обычное разрешение в своем файле манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.myapp">          <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.SET_WALLPAPER" />     <uses-permission android:name="android.permission.VIBRATE" />      <application         android:allowBackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:roundIcon="@mipmap/ic_launcher_round"         android:supportsRtl="true"         android:theme="@style/AppTheme">         <activity android:name=".MainActivity">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application>  </manifest>

В этом примере приложение объявляет три обычных разрешения: INTERNET, SET_WALLPAPER и VIBRATE. Эти разрешения будут автоматически предоставлены системой в процессе установки приложения.

Роль обычных разрешений

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

  • INTERNET: Это разрешение очень важно для приложений, которым необходим доступ к интернету, например, для веб‑браузеров, социальных сетей и любых других приложений, использующих онлайн‑сервисы.

  • SET_WALLPAPER: Приложениям, предлагающим функции кастомизации, например приложениям для управления фонон главного экрана, это разрешение необходимо для изменения изображения на главном экране устройства.

  • VIBRATE: Приложениям, использующим тактильную обратную связь, например, играм или приложениям с уведомлениями, требуется это разрешение для управления вибрацией устройства.

Хотя эти разрешения и считаются относительно безопасными, разработчикам следует проявлять осторожность при их использовании. Важно запрашивать только те разрешения, которые действительно необходимы для функционирования приложения. Неоправданные разрешения могут обратить на себя внимание пользователей и даже привести к удалению приложения из магазина за нарушение правил.

2. Опасные разрешения

Опасные (dangerous) разрешения — это разрешения, позволяющие приложениям получать доступ к данным или выполнять действия, которые потенциально могут нарушить конфиденциальность пользователя или повлиять на работу устройства. В отличие от обычных разрешений, которые предоставляются автоматически, опасные разрешения требуют явного согласия пользователя. Это означает, что, когда приложение запрашивает опасное разрешение, пользователь должен одобрить его в соответствующем диалогового окна.

Категории опасных разрешений

Опасные разрешения делятся на несколько категорий, каждая из которых включает в себя ряд связанных разрешений. Некоторые из наиболее распространенных категорий включают:

1. Контакты:

  • READ_CONTACTS: Позволяет приложению читать данные о контактах пользователя.

  • WRITE_CONTACTS: Позволяет приложению изменять данные о контактах пользователя.

  • GET_ACCOUNTS: Позволяет получить доступ к списку учетных записей в Accounts Service.

2. Расположение:

  • ACCESS_FINE_LOCATION: Предоставляет доступ к точным данным о местоположении (с использованием GPS и сетевых источников).

  • ACCESS_COARSE_LOCATION: Предоставляет доступ к приблизительным данным о местоположении.

3. Камера:

  • CAMERA: позволяет приложению получить доступ к камере устройства, чтобы делать фотографии или снимать видео.

4. Микрофон:

  • RECORD_AUDIO: позволяет приложению получить доступ к микрофону устройства для записи звука.

5. Хранилище:

  • READ_EXTERNAL_STORAGE: Позволяет приложению считывать данные из внешнего хранилища.

  • WRITE_EXTERNAL_STORAGE: Позволяет приложению записывать данные во внешнее хранилище.

6. Телефон:

  • READ_PHONE_STATE: Позволяет получить доступ к состоянию телефона, включая номер телефона и информацию о текущей сети.

  • CALL_PHONE: Позволяет приложению инициировать телефонный звонок минуя UI набора номера.

  • READ_CALL_LOG: Позволяет приложению читать журнал звонков пользователя.

  • WRITE_CALL_LOG: Позволяет приложению изменять журнал звонков пользователя.

  • ADD_VOICEMAIL: Позволяет приложению добавлять голосовую почту в систему.

  • USE_SIP: Разрешает приложению использовать службу SIP.

  • PROCESS_OUTGOING_CALLS: Позволяет приложению видеть и перенаправлять исходящие звонки.

7. SMS:

  • SEND_SMS: Позволяет приложению отправлять SMS‑сообщения.

  • RECEIVE_SMS: Позволяет приложению отслеживать входящие SMS‑сообщения.

  • READ_SMS: Позволяет приложению читать SMS‑сообщения.

  • RECEIVE_WAP_PUSH: позволяет приложению отслеживать входящие WAP push‑сообщения.

  • RECEIVE_MMS: позволяет приложению отслеживать входящие MMS‑сообщения.

Запрос опасных разрешений

Если приложению необходимо опасное разрешение, оно должно запросить его у пользователя во время выполнения. Этот процесс включает в себя отображение диалога, который объясняет, почему это разрешение необходимо приложению, и просит пользователя предоставить или отклонить его. Вот как это можно реализовать с помощью Kotlin:

1. Объявление разрешения в манифесте:

<uses-permission android:name="android.permission.CAMERA" />

2. Запрос разрешения во время выполнения:

import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.activity.result.ActivityResultLauncher  class MainActivity : AppCompatActivity() {      private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)          // Инициализация запроса разрешения         requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->             if (isGranted) {                 // Разрешение получено, можно продолжать работу                 openCamera()             } else {                 // Разрешение отклонено, нужно отобразить пользователю соответствующее сообщение                 Toast.makeText(this, "Camera permission is required to use this feature.", Toast.LENGTH_SHORT).show()             }         }          // Проверка и запрос разрешения на съемку         checkAndRequestCameraPermission()     }      private fun checkAndRequestCameraPermission() {         when {             ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED -> {                 // Разрешение уже получено, можно продолжать работу                 openCamera()             }             else -> {                 // Запрашиваем разрешение                 requestPermissionLauncher.launch(Manifest.permission.CAMERA)             }         }     }      private fun openCamera() {         // Код открытия камеры     } }

Обработка ответов пользователей

При запросе опасного разрешения разработчики должны предоставить обоснование, объясняющее, почему это разрешение необходимо приложению. Это особенно важно, если пользователь ранее отклонил запрос. Четкое и лаконичное объяснение поможет пользователям принимать взвешенные решения.

private fun checkAndRequestCameraPermission() {     when {         ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED -> {             // Разрешение уже получено, можно продолжать работу             openCamera()         }         shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) -> {             // Предоставьте пользователю дополнительное объяснение, если разрешение не было предоставлено ранее             // Покажите диалог или другой элемент пользовательского интерфейса, чтобы объяснить, зачем нужно это разрешение               showPermissionRationale()         }         else -> {             // Запрашиваем разрешение             requestPermissionLauncher.launch(Manifest.permission.CAMERA)         }     } }  private fun showPermissionRationale() {     // Отобразите диалог или элемент пользовательского интерфейса, чтобы объяснить, зачем нужно разрешение     // После объяснения снова запросите разрешение     AlertDialog.Builder(this)         .setTitle("Camera Permission Needed")         .setMessage("This app needs the Camera permission to take pictures and record videos.")         .setPositiveButton("OK") { dialog, _ ->             // Запросите разрешение еще раз             requestPermissionLauncher.launch(Manifest.permission.CAMERA)             dialog.dismiss()         }         .setNegativeButton("Cancel") { dialog, _ ->             // Пользователь отказал в разрешении, покажите сообщение и закройте диалог             dialog.dismiss()         }         .create()         .show() }

Рекомендации по управлению опасными разрешениями

1. Запрашивайте разрешения постепенно:

  • Запрашивайте разрешения только тогда, когда они необходимы, а не все сразу при первом запуске приложения. Это снижает нагрузку на пользователя и делает более понятным, зачем нужно каждое разрешение.

2. Дайте четкие объяснения:

  • Запрашивая опасные разрешения, всегда предоставляйте четкое и ясное обоснование, объясняющее, почему разрешение необходимо и как оно поможет пользователю.

3. Уделите внимание обработке отказов:

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

4. Уважайте конфиденциальность пользователей:

  • Будьте прозрачны в том, как будут использоваться данные пользователя, и обеспечьте их защиту. Старайтесь не запрашивать разрешения, которые не являются необходимыми для основных функций вашего приложения.

5. Регулярно пересматривайте разрешения:

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

3. Разрешение-подпись:

Разрешение‑подпись (signature permission) — это такой тип разрешения Android, которое предоставляется только приложениям, подписанным тем же сертификатом, что и программный продукт, объявивший это разрешение. Когда приложение запрашивает разрешение‑подпись, система проверяет, совпадает ли сертификат запрашивающего приложения с сертификатом приложения, которое определило это разрешение. Если сертификаты совпадают, разрешение предоставляется, в противном случае — отказ.

Как работает разрешение-подпись

1. Объявление:

  • Разработчик определяет пользовательское разрешение в файле манифеста приложения. Это разрешение должно быть отмечено атрибутом protectionLevel со значением signature.

2. Запрос:

  • Другое приложение, подписанное тем же сертификатом, что и объявляющее приложение, запрашивает это разрешение в своем файле манифеста.

3. Валидация:

  • Во время выполнения система Android проверяет сертификаты объявляющего и запрашивающего приложений. Если они совпадают, разрешение предоставляется.

Пример объявления и использования разрешения-подписи

Шаг 1: Объявление разрешения‑подписи

В AndroidManifest.xml объявляющего приложения:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.declaringapp">      <!-- Определение пользовательского разрешения‑подписи -->     <permission         android:name="com.example.declaringapp.MY_SIGNATURE_PERMISSION"         android:protectionLevel="signature" />      <!-- Пример объявления активити -->     <application         android:allowBackup="true"         android:label="@string/app_name"         android:supportsRtl="true"         android:theme="@style/AppTheme">         <activity android:name=".MainActivity">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application> </manifest>

Шаг 2: Запрос разрешения‑подписи

В AndroidManifest.xml запрашивающего приложения:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.requestingapp">      <!-- Запрос разрешения‑подписи -->     <uses-permission android:name="com.example.declaringapp.MY_SIGNATURE_PERMISSION" />      <!-- Пример объявления активити -->     <application         android:allowBackup="true"         android:label="@string/app_name"         android:supportsRtl="true"         android:theme="@style/AppTheme">         <activity android:name=".MainActivity">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application> </manifest>

Шаг 3: Валидация разрешения‑подписи

Мы можем проверить в коде запрашивающего приложения, что разрешение предоставлено, прежде чем использовать связанный с ним функционал:

if (ContextCompat.checkSelfPermission(this, "com.example.declaringapp.MY_SIGNATURE_PERMISSION") == PackageManager.PERMISSION_GRANTED) {     // Разрешение получено, можно продолжать работу     useProtectedFunctionality() } else {     // Разрешение отклонено, обработайте это соответствующим образом     Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show() }

Прокачать навыки разработки Android-приложений до уровня Middle/Senior можно на курсе «Android Developer. Professional».

Примеры использования разрешения-подписи

1. Связь между приложениями:

  • Разрешение‑подпись особенно полезно для взаимодействия между приложениями, разработанными в одной организации. Например, набор бизнес‑приложений может совместно использовать конфиденциальные данные, и использование разрешения‑подписи гарантирует, что только эти доверенные приложения смогут получить доступ к данным друг друга.

2. Контроль доступа:

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

3. Модульная архитектура:

  • В приложениях с модульной архитектурой, где различные модули упаковываются в виде отдельных APK, разрешения‑подписи помогают обеспечить защищенное взаимодействие между этими модулями.

Преимущества разрешения-подписи

1. Повышенная безопасность:

  • Ограничивая доступ к функциям и данным только теми приложениями, которые подписаны одним и тем же сертификатом, этот вид разрешений значительно снижает риск несанкционированного доступа.

2. Доверие и целостность:

  • Они обеспечивают взаимодействие только доверенных приложений от одного разработчика, сохраняя целостность экосистемы приложений.

3. Упрощенное управление разрешениями:

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

Соображения и рекомендации

1. Управление сертификатами:

  • Позаботьтесь о том, чтобы приватный ключ, используемый для подписи приложений, хранился в защищенном хранилище. Компрометация ключа подписи может привести к тому, что неавторизованные приложения получат доступ к важным функциям.

2. Последовательность в подписании:

  • Все приложения, которым необходимо совместно использовать разрешение‑подпись, должны быть последовательно подписаны одним и тем же сертификатом на протяжении всего их жизненного цикла.

3. Тестирование и валидация:

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

4. Документация:

  • Четко документируйте назначение и использование пользовательских разрешений‑подписей в команде разработчиков, чтобы избежать путаницы и обеспечить правильную реализацию.

Разрешения‑подписи в Android обеспечивают надежный механизм контроля доступа к важным функциям и данным для приложений, подписанных одним и тем же сертификатом. Используя разрешения‑подписи, разработчики могут повысить безопасность и целостность своих приложений, гарантируя, что только доверенные приложения в одной экосистеме могут взаимодействовать друг с другом. Этот механизм особенно ценен для организаций, разрабатывающих набор взаимосвязанных приложений или модульных приложений, требующих защищенного механизма взаимодействия.

4. Специальные разрешения:

Специальные (special) разрешения, также известные как «привилегированные» (privileged) или «системные» (system), — это разрешения, позволяющие приложениям выполнять действия, которые могут существенно повлиять на работу устройства и опыт пользователя. Эти разрешения не предоставляются через обычную модель запрашивания во время выполнения, а требуют явного действия пользователя, обычно через переход к настройкам устройства.

Часто используемые специальные разрешения

1. SYSTEM_ALERT_WINDOW (отрисовка поверх других приложений):

  • Это разрешение позволяет приложению отрисовывать контент поверх других приложений. Оно обычно используется в таких приложениях, как Facebook Messenger, для создания виджетов наподобие Chat Heads или в приложениях с оверлеями.

  • Из‑за того, что это разрешение может нарушить взаимодействие с пользователем и безопасность (например, отрисовывать фишинговые окна), пользователи могут предоставить его только через меню настроек.

2. WRITE_SETTINGS (изменение системных настроек):

  • Приложения с таким разрешением могут изменять системные настройки, такие как Wi‑Fi, Bluetooth, яркость экрана и другие.

  • Учитывая потенциальное влияние на поведение устройства, пользователи должны предоставить это разрешение через настройки.

3. BIND_ACCESSIBILITY_SERVICE:

  • Это разрешение позволяет приложению выступать в роли службы специальных возможностей (accessibility), которая может наблюдать за действиями пользователя, сканировать содержимое окна и взаимодействовать с другими приложениями.

  • Службы специальных возможностей — это мощные инструменты, предназначенные в первую очередь для помощи пользователям с ограниченными возможностями, которые при неправильном использовании также могут представлять серьезную угрозу безопасности.

4. REQUEST_INSTALL_PACKAGES:

  • Это разрешение позволяет приложению запрашивать установку пакетов (APK). Обычно оно используется такими приложениями, как магазины приложений или браузеры, для загрузки и установки новых приложений.

  • Пользователи должны явно предоставить это разрешение в диалоговом окне в процессе установки.

5. PACKAGE_USAGE_STATS:

  • Это разрешение позволяет приложению получить доступ к информации об использовании других приложений. Обычно оно используется приложениями, которые отслеживают другие приложения и сообщают о характере их использования или расходе батареи.

  • Пользователям необходимо предоставить это разрешение в настройках, в разделе «Доступ к данным об использовании устройства».

Запрос специальных разрешений

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

Вот пример того, как можно запросить разрешение SYSTEM_ALERT_WINDOW в Kotlin:

import android.content.Intent import android.net.Uri import android.os.Build import android.provider.Settings  private fun checkAndRequestOverlayPermission() {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {         if (!Settings.canDrawOverlays(this)) {             // Запустите экран настроек, чтобы попросить пользователя предоставить разрешение на использование оверлея             val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))             startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION)         } else {             // Разрешение уже получено, можно продолжать работу             proceedWithOverlayFeature()         }     } else {         // Эта модель разрешений не применима в версиях ниже Android M, можно продолжать работу         proceedWithOverlayFeature()     } }  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {     super.onActivityResult(requestCode, resultCode, data)     if (requestCode == REQUEST_OVERLAY_PERMISSION) {         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {             if (Settings.canDrawOverlays(this)) {                 // Разрешение получено, можно продолжать работу                 proceedWithOverlayFeature()             } else {                 // Разрешение отклонено, показываем пользователю соответствующее сообщение                  Toast.makeText(this, "Overlay permission is required to use this feature.", Toast.LENGTH_SHORT).show()             }         }     } }  private fun proceedWithOverlayFeature() {     // Код, использующий функцию оверлея }

В этом фрагменте кода Settings.ACTION_MANAGE_OVERLAY_PERMISSION используется для направления пользователя на экран настроек, где он может предоставить разрешение на использование оверлея.

Соображения безопасности и конфиденциальности

Специальные разрешения дают приложениям возможность выполнять действия, которые могут повлиять на стабильность системы, удобство работы пользователей и безопасность. Поэтому как разработчикам, так и пользователям важно ответственно относиться к этим разрешениям:

  • Используйте их по минимуму: Запрашивайте специальные разрешения только в тех случаях, когда это абсолютно необходимо для работы основного функционала приложения.

  • Предоставьте обоснование: Четко объясните пользователям, зачем нужно это разрешение и как оно будет использоваться.

  • Уделите внимание обработке отказов: Спроектируйте приложение так, чтобы оно по возможности могло функционировать, хоть и с ограничениями, когда специальные разрешения не были предоставлены.

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

Специальные разрешения в Android — это важнейшая часть безопасности и функциональности системы, позволяющая приложениям выполнять задачи, выходящие за рамки стандартных возможностей приложений. Требуя явного согласия пользователя через системные настройки, Android гарантирует, что пользователи сохранят контроль над своими устройствами. Разработчики должны подходить к этим разрешениям с осторожностью, ставя во главу угла доверие и безопасность пользователей, а пользователи должны быть осмотрительны в отношении разрешений, которые они предоставляют, чтобы сохранить целостность и безопасность своих устройств.

Группы разрешений

Разрешения делятся на группы, каждая из которых включает в себя несколько связанных разрешений. Например, группа «Contacts» включает в себя разрешения на чтение, запись и доступ к контактам. Когда приложение запрашивает разрешение из группы, оно неявно получает доступ и к другим разрешениям из той же группы. Такая группировка призвана упростить процесс управления разрешениями для пользователей.

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

Начиная с версии Android 6.0 (Marshmallow), Google ввела модель разрешений во время выполнения (runtime permissions), отойдя от предыдущей модели разрешений во время установки. Согласно этой модели, пользователям предлагается предоставлять разрешения по мере необходимости приложения, а не в момент установки. Такой подход обеспечивает пользователям лучший контроль над своими данными и более четкое понимание того, зачем нужны эти разрешения.

Преимущества такого подхода к разрешениям:

  • Больший контроль со стороны пользователей: Пользователи могут принимать более взвешенные решения о предоставлении разрешений, что позволяет повысить контроль над своими данными.

  • Повышенная прозрачность: Запрашивая разрешения во время выполнения, приложения должны предоставлять контекст, объясняющий, зачем требуется разрешение, что повышает прозрачность.

  • Гранулярное управление разрешениями: Пользователи могут предоставлять или запрещать отдельные разрешения, а не предоставлять во время установки либо все сразу, либо ни одного разрешения.

Реализация разрешений во время выполнения

Со стороны разработчика реализация разрешений во время выполнения включает в себя несколько этапов:

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

  2. Запросите разрешение, если оно не предоставлено: Если разрешение не предоставлено, приложение должно запросить его у пользователя.

  3. Обработка реакции пользователя: Приложение должно соответствующим образом обрабатывать реакцию пользователя, включая возможность того, что пользователь откажется от разрешения.

Объявления контракта разрешения:

import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.activity.result.ActivityResultLauncher  private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>  // Инициализация запроса разрешения requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->     if (isGranted) {         // Разрешение получено, можно продолжать работу          openCamera()     } else {         // Разрешение отклонено, нужно отобразить пользователю соответствующее сообщение         Toast.makeText(this, "Camera permission is required to use this feature.", Toast.LENGTH_SHORT).show()     } }

Проверка и запрос разрешения:

private fun checkAndRequestCameraPermission() {     when {         ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED -> {             // Разрешение уже получено, можно продолжать работу             openCamera()         }         else -> {             // Запрашиваем разрешение             requestPermissionLauncher.launch(Manifest.permission.CAMERA)         }     } }

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

// Например, вызовите это в onCreate или при нажатии кнопки отерытия камеры checkAndRequestCameraPermission()

Определение функции openCamera:

private fun openCamera() {     // Код открытия камеры }

Этот подход использует ActivityResultContracts.RequestPermission для обработки жизненного цикла запроса разрешения, что упрощает управление и соответствует современной практике разработки под Android.

Полный пример:

import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat  class MainActivity : AppCompatActivity() {      private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)          // Инициализация запроса разрешения         requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->             if (isGranted) {                 // Разрешение получено, можно продолжать работу                 openCamera()             } else {                 // Разрешение отклонено, нужно отобразить пользователю соответствующее сообщение                 Toast.makeText(this, "Camera permission is required to use this feature.", Toast.LENGTH_SHORT).show()             }         }          // Проверка и запрос разрешения на использование камеры         checkAndRequestCameraPermission()     }      private fun checkAndRequestCameraPermission() {         when {             ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED -> {                 // Разрешение уже получено, можно продолжать работу                 openCamera()             }             else -> {                 // Запрашиваем разрешение                 requestPermissionLauncher.launch(Manifest.permission.CAMERA)             }         }     }      private fun openCamera() {         // Код открытия камеры     } }

Рекомендации для разработчиков

1. Запрашивайте только необходимые разрешения:

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

2. Дайте четкие объяснения:

  • При запросе опасных разрешений разработчики должны давать лаконичные и понятные объяснения, зачем эти разрешения нужны. Это можно сделать в диалоговом окне запроса разрешения.

3. Уделите внимание обработке отказа в разрешении:

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

4. Регулярно просматривайте и обновляйте разрешения:

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

5. Тщательно тестируйте приложение:

  • Разработчики должны тщательно тестировать свои приложения, чтобы убедиться, что они правильно обрабатывают запросы и отказы в разрешениях, обеспечивая бесперебойную работу пользователей.

6. Уважайте выбор пользователя:

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

Ответственность пользователя

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

  • Проверять разрешения: Внимательно читать разрешения, запрашиваемые приложениями, прежде чем предоставлять их.

  • Использовать надежные источники: Загружать приложения из надежных источников, таких как Google Play Store, в котором предусмотрены меры безопасности для обнаружения вредоносных приложений.

  • Регулярно проверять установленные приложения: Периодически проверять разрешения, предоставленные установленным приложениям, и отзывать в тех из них, которые кажутся ненужными.

  • Понимать последствия своих действий: Знать, что влечет за собой каждое разрешение и как оно может повлиять на конфиденциальность и безопасность.

Часто используемые разрешения и связанные с ними риски

1. Местонахождение:

  • Доступ к точному местоположению: Позволяет приложениям получать доступ к точным координатам (GPS и сети). Обычно используются в навигационных приложениях. При злоупотреблении этим разрешением возникает риск нарушения конфиденциальности.

  • Доступ к примерному местоположению: Позволяет приложениям получать доступ к приблизительному местоположению. Это менее точно, но все же полезно для некоторых приложений.

2. Камера:

  • Доступ к камере: Разрешает приложениям делать фотографии и записывать видео. При злоупотреблении этим разрешением можно получить несанкционированный доступ к визуальным данным.

3. Микрофон:

  • Запись звука: Разрешает приложениям записывать звук с микрофона. Это необходимо для создания голосовых заметок или совершения звонков, но также вызывает опасения о возможности несанкционированного прослушивания.

4. Контакты:

  • Чтение контактов: Позволяет приложениям получать доступ к контактам пользователя. Это полезно для приложений социальных сетей, но при злоупотреблении может привести к сбору данных.

  • Запись контактов: Позволяет приложениям изменять контакты пользователя. Это не всегда необходимо, но иногда может быть полезно для реализации определенных функций.

5. Хранение:

  • Считывание данных с внешних хранилищ: Дает возможность приложениям считывать информацию с внешних устройств, таких как SD‑карты. Это разрешение необходимо для файловых менеджеров.

  • Запись во внешние хранилища: Позволяет приложениям записывать данные во внешнее хранилище. Это разрешение необходимо для приложений, которым нужно сохранять файлы.

6. Телефон:

  • Чтение состояния телефона: Позволяет приложениям получать доступ к состоянию телефона, включая номер телефона, текущую информацию о сотовой сети и статус текущего вызова. Это нужно для управления вызовами, но может привести к раскрытию личной информации.

Управление разрешениями на устройстве

Android предлагает пользователям инструменты, позволяющие эффективно контролировать разрешения, выдаваемые приложениям:

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

  2. Менеджер разрешений: Этот инструмент, доступный в меню настроек, позволяет классифицировать разрешения и отображает, какие приложения имеют доступ к каждому из типов.

  3. Отмена разрешений: В любой момент пользователи могут отозвать ранее предоставленные разрешения. Это особенно важно, если они больше не доверяют какому‑либо приложению или если его функциональность изменилась.

Расширенные функции управления разрешениями

1. Одноразовые разрешения:

  • Введенные в Android 11 одноразовые разрешения позволяют пользователям временно предоставлять доступ к личным данным, таким как местоположение, микрофон или камера. Как только приложение будет закрыто, разрешение перестанет действовать.

2. Автосброс разрешений:

  • Android автоматически сбрасывает разрешения для приложений, которые не использовались в течение нескольких месяцев. Благодаря этому неиспользуемые приложения со временем теряют доступ к конфиденциальным данным.

3. Scoped Storage:

  • Система Scoped Storage предназначена для управления доступом приложений к внешним хранилищам данных. Она позволяет каждому приложению получать доступ только к своим собственным файлам и к определенным типам носителей, что значительно снижает риск утечки конфиденциальной информации.

Заключение

Система разрешений — важнейший компонент архитектуры безопасности операционной системы Android. Она предоставляет структурированный способ управления доступом приложений к важным данным и функциям, что, в свою очередь, помогает защитить конфиденциальность пользователей и сохранить целостность устройства. И разработчики, и пользователи играют важную роль в этой экосистеме. Разработчики обязаны следовать передовым практикам управления разрешениями, в то время как пользователи должны быть осведомлены и осторожны при предоставлении доступа. Благодаря совместным усилиям экосистема Android продолжит развиваться как безопасная и удобная платформа.


24 марта в Otus пройдет открытый урок на тему «Material Design 3.0 — что нужно знать разработчику». Разберемся, как пользоваться документацией, изучим инструменты и рассмотрим наиболее важные требования.

Если интересно, записывайтесь на странице курса «Android Developer. Professional».


ссылка на оригинал статьи https://habr.com/ru/articles/892020/