Разрешения нужны не только для запроса системных функций. Вы также можете ограничить взаимодействие других приложений с компонентами вашего приложения.
В этом руководстве объясняется, как проверить набор разрешений, объявленных другим приложением. В руководстве также объясняется, как настроить действия, службы, поставщиков контента и приёмники широковещательных сообщений, чтобы ограничить взаимодействие других приложений с вашим.
Проверьте разрешения другого приложения
Чтобы просмотреть набор разрешений, которые объявляет другое приложение, используйте устройство или эмулятор для выполнения следующих шагов:
- Откройте экран информации о приложении.
 Выберите «Разрешения» . Загрузится экран разрешений приложения .
На этом экране показан набор групп разрешений. Система организует набор разрешений, объявленных приложением, по этим группам.
Есть ряд других полезных способов проверки разрешений:
-  Чтобы проверить разрешение во время вызова службы, передайте строку разрешения в 
Context.checkCallingPermission(). Этот метод возвращает целое число, указывающее, предоставлено ли это разрешение текущему вызывающему процессу. Обратите внимание, что это можно использовать только при выполнении вызова из другого процесса, обычно через интерфейс IDL, опубликованный службой, или каким-либо другим способом предоставленный другому процессу. -  Чтобы проверить, предоставлено ли другому процессу определенное разрешение, передайте идентификатор процесса (PID) в 
Context.checkPermission(). -  Чтобы проверить, предоставлено ли другому пакету определенное разрешение, передайте имя пакета в 
PackageManager.checkPermission(). 
Ограничьте взаимодействие с действиями вашего приложения
 В манифесте используйте атрибут android:permission тега <activity> , чтобы ограничить, какие другие приложения могут запускать это Activity . Разрешение проверяется в методах Context.startActivity() и Activity.startActivityForResult() . Если у вызывающего объекта нет необходимого разрешения, возникает исключение SecurityException .
Ограничьте взаимодействие со службами вашего приложения
 В манифесте используйте атрибут android:permission тега <service> , чтобы ограничить, какие другие приложения могут запускать связанную Service или подключаться к ней. Разрешение проверяется в методах Context.startService() , Context.stopService() и Context.bindService() . Если у вызывающего объекта нет необходимого разрешения, возникает исключение SecurityException .
Ограничьте взаимодействие с поставщиками контента вашего приложения
 В манифесте используйте атрибут android:permission тега <provider> , чтобы ограничить доступ других приложений к данным в ContentProvider . (Поставщики контента имеют важный дополнительный механизм безопасности, называемый разрешениями URI , который описан в следующем разделе.) В отличие от других компонентов, для поставщиков контента можно задать два отдельных атрибута разрешений: android:readPermission ограничивает, какие приложения могут читать данные с поставщика, а android:writePermission ограничивает, какие приложения могут записывать данные в него. Обратите внимание: если поставщик защищён как разрешением на чтение, так и разрешением на запись, наличие только разрешения на запись не позволяет приложению читать данные с поставщика.
 Разрешения проверяются при первом обращении к поставщику и при выполнении приложением операций с поставщиком. Если у запрашивающего приложения нет ни одного из разрешений, возникает исключение SecurityException . Для использования ContentResolver.query() требуется разрешение на чтение; для использования ContentResolver.insert() , ContentResolver.update() или ContentResolver.delete() требуется разрешение на запись. Во всех этих случаях отсутствие необходимого разрешения приводит к возникновению исключения SecurityException .
Предоставить доступ на основе URI
 Система предоставляет вам дополнительный точный контроль над доступом других приложений к поставщикам контента вашего приложения. В частности, ваш поставщик контента может защитить себя с помощью разрешений на чтение и запись, при этом позволяя своим прямым клиентам обмениваться определёнными URI с другими приложениями. Чтобы объявить о поддержке этой модели вашим приложением, используйте атрибут android:grantUriPermissions или элемент <grant-uri-permission> .
 Вы также можете предоставлять разрешения на уровне URI. При запуске действия или возврате результата в действие установите флаг намерения Intent.FLAG_GRANT_READ_URI_PERMISSION , флаг намерения Intent.FLAG_GRANT_WRITE_URI_PERMISSION или оба флага. Это предоставит другим приложениям разрешения на чтение, запись или чтение и запись для URI данных, включённого в намерение, соответственно. Другие приложения получат эти разрешения для конкретного URI независимо от того, есть ли у них разрешение на доступ к данным в поставщике контента в целом.
 Например, предположим, что пользователь просматривает электронное письмо с прикрепленным изображением в вашем приложении. Другие приложения не должны иметь доступа к содержимому письма, но им может быть интересно посмотреть изображение. Ваше приложение может использовать намерение и флаг намерения Intent.FLAG_GRANT_READ_URI_PERMISSION чтобы разрешить приложению для просмотра изображений увидеть изображение.
Ещё один фактор, который следует учитывать, — видимость приложения . Если ваше приложение предназначено для Android 11 (API уровня 30) или выше, система автоматически делает некоторые приложения видимыми для него и скрывает другие по умолчанию. Если у вашего приложения есть поставщик контента и оно предоставило другому приложению разрешения URI, ваше приложение автоматически становится видимым для этого другого приложения.
 Для получения дополнительной информации просмотрите справочные материалы по методам grantUriPermission() , revokeUriPermission() и checkUriPermission() .
Ограничьте взаимодействие с приемниками вещания вашего приложения
 Используйте атрибут android:permission тега <receiver> , чтобы ограничить, какие другие приложения могут отправлять широковещательные сообщения связанному объекту BroadcastReceiver . Система проверяет разрешение после возврата Context.sendBroadcast() , пытаясь доставить отправленное широковещательное сообщение указанному приемнику. Это означает, что ошибка разрешения не приводит к передаче исключения вызывающему объекту — она просто не доставляет Intent ).
Вы также можете настроить разрешения программно:
-  Чтобы контролировать, какие другие приложения могут осуществлять вещание на программно зарегистрированный приемник: предоставьте разрешение 
Context.registerReceiver(). -  Чтобы ограничить круг получателей вещания, которые могут принимать вещание: укажите разрешение при вызове 
Context.sendBroadcast(). 
Обратите внимание, что разрешение может потребоваться как получателю, так и отправителю. В этом случае для доставки намерения соответствующему получателю должны быть пройдены обе проверки. Подробнее см. в разделе «Ограничение вещания с помощью разрешений» .