Экспортированное действие не требует разрешения при попытке запуска с 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, которые сообщают об этом же предупреждении, и все решения, похоже, не работают.

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

Спасибо


person Brad    schedule 13.07.2012    source источник
comment
возможный дубликат Предупреждение: для экспортированной активности не требуется разрешение   -  person Sergey Glotov    schedule 08.11.2012


Ответы (3)


У меня была такая же проблема, когда я обновил 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>

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

Причина, по которой он это исправляет, находится в документации:

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

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

person Shine    schedule 17.07.2012
comment
У меня была такая же проблема при обновлении SDK. В моем случае предупреждение появилось только для активности с возможностью поиска - person Jose_GD; 20.09.2012
comment
Спасибо за ответ, я добавил атрибут android: exported в свою активность, но мне пришлось установить для него значение true, потому что намерение должно быть доступно извне. И теперь я получаю предупреждение «Экспортированная активность» снова не требует разрешения. Кто-нибудь знает, чего не хватает, если android: exported верно? - person white_gecko; 28.11.2012
comment
Я считаю, что это неверный ответ. Если я установлю android:exported="false", диалоговое окно выбора не откроется. Очистить проект было для меня проблемой. - person rekire; 03.12.2012
comment
Ответ кажется верным и для сервисов и получателей. - person ohaleck; 15.05.2013

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

person cleroo    schedule 17.07.2012
comment
ты абсолютно ПРАВИЛЬНЫЙ! действительно, он удалил множество неприятных предупреждений, в том числе. мне нравится вид кода без предупреждений по утрам (апокалипсис д'апре сейчас) - person tony gil; 23.07.2012
comment
Только для того, чтобы при повторной компиляции проекта снова всплывало предупреждение? Вот что случилось со мной. - person Yatharth Agarwal; 25.11.2012

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

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

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

Спасибо @furykid за ссылки.

person white_gecko    schedule 27.11.2012
comment
Я не понимал, что разрешение не требуется, значит, я должен добавить разрешение android: для экспортируемой службы. Это единственный ответ, который я нашел до сих пор. Спасибо. - person aragaer; 30.01.2013