SecurityException: Отказ в разрешении: при запуске Activity через явное намерение - PullRequest
0 голосов
/ 27 января 2019

Я читал о декларации разрешений в действии .Согласно документации

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

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

Это шаги, за которыми я следовал

  1. Создано 2 приложения (скажем, отправитель и получатель)
  2. Добавлено разрешение <uses-permission android:name="permission.SHARE_POST"/> в Manifest отправителя
  3. Теперь, нажав кнопку приложения Отправитель, я вызываю Активность получателей с именем ShareActivity следующим образом

        Intent intent = new Intent();
        intent.setComponent(new ComponentName("basics.android.com.androidbasics","basics.android.com.androidbasics.ShareActivity"));
        startActivity(intent);
    

    ПРИМЕЧАНИЕ: basics.android.com.androidbasics - это имя пакетаприемник

  4. Ниже приведено объявление активности в манифесте второго приложения (получателя)

           <activity
            android:name=".ShareActivity"
            android:exported="true"
            android:permission="permission.SHARE_POST"/>
    

Теперь, когда я запускаю обаприложения и попытаться отправить ShareActivity от отправителя, я получаю следующую ошибку

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { cmp=basics.android.com.androidbasics/.ShareActivity } from ProcessRecord{e09a1fc 26267:sender.android.com.sender/u0a925} (pid=26267, uid=10925) requires permission.SHARE_POST

Похоже, что отправитель еще не имеет разрешения permission.SHARE_POST.Но я уже заявил об этом в декларации отправителя.Что тут происходит?

1 Ответ

0 голосов
/ 27 января 2019

Использование пользовательских разрешений - довольно сложная вещь в Android.Основной рецепт:

  1. Решите, каким вы хотите, чтобы имя разрешения было.Он должен быть уникальным на устройстве.Таким образом, permission.SHARE_POST не является хорошим выбором - добавьте префикс, который привязан к вашему доменному имени или к чему-либо еще, что вы используете в качестве основы для значений applicationId ваших приложений.
  2. Вприложение, которое защищает себя с помощью разрешения, объявляет элемент <permission> с атрибутом android:name, содержащим имя разрешения из шага # 1.При желании присвойте ему атрибут android:protectionLevel (например, signature, чтобы только приложения, подписанные одним и тем же ключом подписи, могли работать вместе).
  3. В приложении, защищающемся с помощью разрешения, добавьте android:permission атрибут компонента (например, <activity>), со значением вашего имени разрешения из шага # 1.
  4. В приложении, которое ищет связь с приложением из шага # 3, добавьтеАтрибут <uses-permission> с атрибутом android:name, содержащим имя разрешения из шага № 1.
  5. В обоих приложениях установите minSdkVersion на 21, так как есть проблемы безопасности с пользовательскими разрешениями в более старых версиях.

Это будет работать, если защитник (шаг № 2 и № 3) всегда будет установлен перед клиентом (шаг № 4).Если вы хотите, чтобы приложения можно было устанавливать в любом порядке, замените шаг № 2 сверху на:

В обоих приложениях объявите элемент <permission> с атрибутом android:name, содержащим имя разрешения из шага # 1.При желании присвойте ему атрибут android:protectionLevel (например, signature, чтобы только приложения, подписанные одним и тем же ключом подписи, могли работать вместе).Кроме того, убедитесь, что оба приложения всегда подписаны одним и тем же ключом подписи, так как в противном случае они не могут определять одно и то же разрешение.
...