Найти в Дзене

🐾 uses-permission vs permission 🐾

Когда мы открываем AndroidManifest, там можно встретить два разрешения: и На вид они почти одинаковые, и многие разработчики на старте путаются (да и не на старте). Но на самом деле — это очень разные сущности, и живут они на разных этажах Android-вселенной. <uses-permission> — это равносильно словам: «Привет! Моё приложение хочет использовать вот это разрешение». Пример: котик хочет выйти на улицу (доступ в интернет): <uses-permission android:name="android.permission.INTERNET" /> Важно: uses-permission ничего не создаёт. Оно просто просит. А вот <permission> — это уже про власть и контроль. Мы самостоятельно придумываем имя, уровень доступа и решаем, кто может его использовать.: «Я создаю новое разрешение. Пусть другие приложения просят у меня разрешения, чтобы сделать что-то в моём мире». Например, котик охраняет миску с кормом и говорит: «Только приложения с подписью от моего разработчика могут есть отсюда». Мы написали приложение с контент-провайдером «CatProvider», где хранятся
Оглавление

Когда мы открываем AndroidManifest, там можно встретить два разрешения:

и

-2

На вид они почти одинаковые, и многие разработчики на старте путаются (да и не на старте). Но на самом деле — это очень разные сущности, и живут они на разных этажах Android-вселенной.

uses-permission — мы просим разрешение

<uses-permission> — это равносильно словам:

«Привет! Моё приложение хочет использовать вот это разрешение».

Пример: котик хочет выйти на улицу (доступ в интернет):

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

  • Приложение просит ОС: «Разреши, пожалуйста, использовать интернет».
  • Если разрешение опасное (например, доступ к камере или контактам) — пользователь увидит запрос в рантайме.
  • Если разрешение нормальное (например, интернет), система просто автоматически даёт доступ — без диалогов.

Важно: uses-permission ничего не создаёт. Оно просто просит.

permission — мы создаём своё разрешение

А вот <permission> — это уже про власть и контроль. Мы самостоятельно придумываем имя, уровень доступа и решаем, кто может его использовать.:

«Я создаю новое разрешение. Пусть другие приложения просят у меня разрешения, чтобы сделать что-то в моём мире».

Например, котик охраняет миску с кормом и говорит:

«Только приложения с подписью от моего разработчика могут есть отсюда».
-3
  • Часто используется, если мы делаем свой ContentProvider, Service или Broadcast, доступ к которым хотим ограничить.
  • Можно указать разный protectionLevel. Например:
    normal — обычное разрешение
    dangerous — потребует согласия пользователя
    signature — только приложения с такой же подписью
  • Другие приложения будут писать в своём манифесте: <uses-permission android:name="ru.ladgertha.cats.FEED_MY_CAT"/> (вот тут как раз просят разрешение)

Пример

Мы написали приложение с контент-провайдером «CatProvider», где хранятся секретные фоточки кота. Мы хотим, чтобы только наши же приложения могли их смотреть.

Что делаем:

<permission
android:name="ru.ladgertha.cats.READ_CATS"
android:protectionLevel="signature" />

<provider
android:name=".CatProvider"
android:authorities="ru.ladgertha.cats.catapp"
android:readPermission="ru.ladgertha.cats.catapp.READ_CATS"/>

А наше второе приложение, которое хочет читать котиков, пишет:

<uses-permission android:name="ru.ladgertha.cats.catapp.READ_CATS"/>

Если подпись совпадает — котики открываются. Если нет — мимо.

Итог

  • uses-permissionя хочу использовать разрешение ("можно, пожалуйста?").
  • permissionя создаю разрешение для других ("ты вообще кто такой?").
-4

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes