37

我正在尝试使用此 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 问题,并且所有解决方案似乎都不起作用。

如何正确编写活动意图过滤器以避免警告?

谢谢

4

3 回答 3

93

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

由于“导出的接收器不需要许可”(至少 LINT 消息是明确的),你明白了。

于 2012-07-17T15:40:28.303 回答
41

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

于 2012-07-17T14:07:08.490 回答
18

要消除此警告,您有两种选择:

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

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

感谢@furykid提供链接。

于 2012-11-27T21:45:28.663 回答