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

38
我尝试使用这篇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>

我试图使用http://example.com链接启动MainActivity,但是遇到了警告问题。

"exported activity does not require permission"

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

我该如何编写活动 intent-filter 才能避免这个警告?

谢谢


可能是警告:导出的活动不需要权限的重复问题。 - Sergey Glotov
3个回答

94

当我更新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:默认值取决于活动是否包含意图过滤器。缺少任何过滤器意味着只能通过指定其确切类名来调用该活动。这意味着该活动仅供应用程序内部使用(因为其他人不会知道类名)。所以在这种情况下,默认值为“false”。另一方面,至少有一个过滤器存在意味着该活动是面向外部使用的,因此默认值为“true”

由于“导出接收器不需要权限”(至少LINT消息很清楚),你已经懂了。


当我更新SDK时,我遇到了同样的问题。在我的情况下,警告仅出现在可搜索的活动中。 - Jose_GD
谢谢你的回答,我已经在我的活动中添加了"android:exported"属性,但是我不得不将其设置为true,因为意图应该可以从外部访问。现在我又收到了"导出的活动不需要权限"的警告。有人知道如果"android:exported"为true时缺少什么吗? - white_gecko
9
我认为这个答案是错误的。如果我将 android:exported="false" 设置为 false,选择对话框将不会打开。清理项目可以解决我的问题。 - rekire
1
答案似乎也适用于服务和接收器。 - ohaleck

41

你尝试过清理项目吗(项目 > 清理...)?这解决了我的项目的警告,也许你的问题也可以这样解决。


4
你是绝对正确的!确实清除了很多混乱的警告,其中包括“我喜欢在早上看到无警告的代码”的情况(取自《现代启示录》) - tony gil
1
当你再次编译项目时,只是想让警告弹出框重新出现吗?这就是我遇到的情况。 - Yatharth Agarwal

18
为了摆脱这个警告,您有两个选择:
  • 要防止其他应用程序通过意图调用您的 Activity,可以将android:exported="false" 属性设置在该 Activity 上。
  • 如果您希望允许其他应用程序调用您的 Activity,则需要添加一个android:permission 属性,您可以在其中指定应用程序需要具备哪些权限才能调用您的 activity。
  • 如果您想允许其他应用程序在没有任何特殊权限的情况下调用您的 Activity,则似乎必须在 Manifest 中接受警告。
您可以在Android 文档中获取更多信息。
感谢@furykid提供的链接。

我没有意识到“不需要权限”意味着我应该将“android:permission”添加到导出服务中。这是迄今为止我找到的唯一答案。谢谢。 - aragaer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接