"Экспортированная активность не требует разрешения" при попытке запуска из URI

Я пытаюсь запустить приложение Android из URI, используя этот вопрос SO в качестве ссылки.

У меня есть файл манифеста со следующим объявленным действием:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="http" android:host="example.com" />
    </intent-filter>
</activity>

Я пытаюсь запустить MainActivity с помощью ссылки http://example.com. Моя проблема в том, что я получаю предупреждение

"exported activity does not require permission"

Я рассмотрел другие вопросы SO, которые сообщают об этом же предупреждении, и все решения, похоже, не работают.

Как правильно написать фильтр намерений активности, чтобы избежать предупреждения?

Спасибо

Ответ 1

У меня была такая же проблема, когда я обновил SDK до версии 20. Я удалил его, добавив android: exported.

<activity 
  android:name=".MainActivity"
  android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="http" android:host="example.com" />
    </intent-filter>
</activity>

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

По этой причине он найден на docs:

android: экспортировано. Значение по умолчанию зависит от того, содержит ли активность фильтры намерений. Отсутствие каких-либо фильтров означает, что действие может быть вызвано только путем указания его точного имени класса. Это означает, что действие предназначено только для внутреннего использования приложения (так как другие не знают имя класса). Поэтому в этом случае значением по умолчанию является "false". С другой стороны, наличие хотя бы одного фильтра подразумевает, что действие предназначено для внешнего использования, поэтому значение по умолчанию - "true" .

Так как "Экспортированный приемник не требует разрешения" (по крайней мере, сообщение LINT понятно), вы получили его.

Ответ 2

Вы пытались очистить свой проект (Project > Clean...)? Он зафиксировал это предупреждение для моего проекта, возможно, вашего.

Ответ 3

Чтобы избавиться от этого предупреждения, у вас есть два варианта:

  • Либо вы устанавливаете атрибут android:exported="false" в Activity на , чтобы другие приложения не вызывали вашу активность с помощью намерения
  • Или если , позволяющее другим приложениям вызывать вашу активность, вам нужно добавить атрибут android:permission, где вы можете указать, какие разрешения необходимо иметь для приложения, чтобы вызвать вашу активность.
  • Если вы хотите разрешить другим приложениям вызывать свою активность без какого-либо специального разрешения, вы можете получить с ним предупреждение в манифесте.

Дополнительную информацию можно найти в Документация для Android.

Благодаря @furykid для ссылок.