尝试从URI启动时,"导出的活动不需要权限"

Bra*_*rad 36 android uri intentfilter

我正在尝试使用此SO问题作为参考从URI启动Android应用程序.

我有一个清单文件,其中包含以下声明的活动:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="http" android:host="example.com" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用http://example.com链接启动MainActivity .我的问题是我得到了警告

"exported activity does not require permission"
Run Code Online (Sandbox Code Playgroud)

我已经查看了报告此相同警告的其他SO问题,并且所有解决方案似乎都不起作用.

如何正确编写活动intent-filter以避免警告?

谢谢

Shi*_*ine 91

当我将SDK更新到版本20时,我遇到了同样的问题.我删除它添加android: exports propery:

<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>
Run Code Online (Sandbox Code Playgroud)

在清单中的活动声明中.当然,如果活动仅供应用程序内部使用,您可以指定此项

修复它的原因可以在docs上找到:

android:exported:默认值取决于活动是否包含intent过滤器.缺少任何过滤器意味着只能通过指定其确切的类名来调用活动.这意味着该活动仅供应用程序内部使用(因为其他人不知道类名).所以在这种情况下,默认值为"false".另一方面,至少有一个过滤器的存在意味着该活动旨在供外部使用,因此默认值为"true".

由于"导出的接收器不需要许可"(至少LINT消息是清楚的),你得到它.

  • 我认为这个答案是错误的.如果我设置`android:exported ="false"`选择对话框将无法打开.清理项目为我解决了问题. (9认同)

cle*_*roo 40

您是否尝试清理项目(项目>清洁......)?它为我的项目修复了这个警告,也许是你的.

  • 你完全正确!事实上它确实清除了许多混乱的警告,包括这些警告."我喜欢在早上看到无警告的代码"(d apres apocalypse now) (4认同)

whi*_*cko 18

要摆脱这个警告,你有两个选择:

  • 您可以android:exported="false"在"活动"上设置属性,以防止其他应用通过意图调用您的"活动"
  • 或者,如果允许其他应用程序调用您的活动,则需要添加android:permission属性,您可以在其中指定应用程序需要具有哪些权限才能调用您的活动.
  • 如果您想允许其他应用程序在未经任何特殊许可的情况下调用您的活动,则必须在Manifest中发出警告.

您可以在Android文档中获得更多信息.

感谢@furykid的链接.