【问题标题】:Android: Filter intent for specific Uri patternAndroid:过滤特定 Uri 模式的意图
【发布时间】:2010-11-05 22:07:36
【问题描述】:

我需要我的 Android 应用程序在我的应用程序中运行某个 Activity,以响应发出的 Intent 中的以下 Uri 数据:

http://www.example.com/redirect.aspx?customurl=example%3a%2f%2f%3fop%3dexampledetail%26stuff%3d12345%26morestuff%3dI%2520Love%25Android

如果我在清单中使用以下内容(对于我想要响应 Intent 的 Activity),我可以捕获它,但会弹出选择器(我不想要):

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

由于我不希望选择器弹出,我尝试在标签中使用 android:pathPattern 或 android:pathPrefix 来进一步过滤以确保只有我的应用响应但它不适合我.

谁能帮我做这个?

【问题讨论】:

  • 我只是将其发布为评论,而不是答案,因为我真的只是在猜测(我还没有做过任何 Android 编程),但我认为你会如果有另一个应用程序可以响应相同的意图(特别是浏览器,在您的情况下),则始终获取选择器,直到用户说“始终使用这个”。也许使用自定义 URI 方案可以避免这种情况?
  • 这就是我假设将由 pathPattern 或 pathPrefix 完成的。
  • 一个特定的 URI 方案确实可以解决这个问题,不幸的是我必须处理 DoubleClick,所以该方案绝对必须是 http。

标签: android filter android-activity android-intent pattern-matching


【解决方案1】:

如果我在清单中使用以下内容(对于我想要响应 Intent 的 Activity),我可以捕获它,但会弹出选择器(我不想要):

大多数 Android 设备上都有 1 个以上的浏览器。完全欢迎用户在其中一个浏览器而不是您的应用程序中访问该 URL,这就是选择器出现的原因。此外,如果开发人员能够劫持他们想要的任何 HTTP URL,这将是一个巨大的安全漏洞。

现在,如果您拥有此 URL 链接到的网站,则可以使用条形码扫描仪使用的技巧:使用浏览器检测将智能放在该页面上,如果在 Android 浏览器中查看,则会向用户解释为什么他们应该允许您的应用在未来处理该 URL。

【讨论】:

  • 这是一个没有人会浏览的自定义 URL。它只是以 URL 的形式传递给意图的数据。
  • @Scienceprodigy:那你为什么要使用 HTTP URL,如果它不是真正的 HTTP URL?
  • @Scienceprodigy:除了你的问题,我不知道你想做什么。正如您在问题中所说的那样,您正在尝试做的事情显然可以完成。但是,用户将获得选择器。如果您使用 HTTP URL,这是不可避免的。如果它“只是以 URL 的形式传递给 Intent 的数据”,那么不要使用 HTTP URL。使用争议较小的选项,例如intent URL。有关示例,请参见 commonsware.com/sample(第三个项目符号)和 github.com/commonsguy/cw-advandroid/tree/master/Introspection/…
  • @CommonsWare:简短的回答是我正在处理 DoubleClick,他们不会接受自定义方案,它必须是 http。
  • Scienceprodigy:我这样说:操作系统应该如何先验地知道您的 URL 不是应该被浏览到的东西,而是应该由您的应用程序处理?据它所知,这是一个常规的 HTTP URL
【解决方案2】:

看起来你在处理来自你自己的应用程序的数据,所以不要使用你的“私有”URL作为意图的目标,而是创建一个组件特定的意图并将你的数据的 URL 作为额外的参数。

类似:

Uri privateUri = Uri.parse("http://yourserver.com/path/to/data");
Intent i = new Intent(context, yourActivity.class);
i.putExtra("DATA_URI", privateUri);
startActivity(i);

在 yourActivity.class 中,您只需使用以下代码获取 Uri:

Uri privateUri = (Uri) getIntent().getParcelableExtra("DATA_URI");

【讨论】:

  • 数据实际上不是来自我的应用程序,而是来自广告 SDK,当点击特定广告时,它会使用 VIEW 操作创建一个隐式 Intent。我正在尝试绕过选择器并在我的应用程序中处理 Intent。
  • 如果您不是意图的发起者,您将无法执行此操作。所有带有 ACTION_VIEW 和 http 方案的意图都应该通过浏览器的选择呈现给用户。正如 CommonsWare 所介绍的,让应用程序无缝拦截 http 意图将是一个巨大的安全漏洞,允许用恶意软件替换支付或银行(例如)URL 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2015-05-14
相关资源
最近更新 更多