Android:过滤特定Uri模式的意图

Chr*_*rry 3 android filter pattern-matching android-intent android-activity

我需要我的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>
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以帮我这样做吗?

Com*_*are 7

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

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

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

  • Scienceprodigy:我会这样说的:操作系统应该如何知道你的URL不是应该被浏览的东西,而应该由你的应用处理?据它所知,这是一个常规的HTTP URL (2认同)

Kev*_*din 6

看起来您处理来自您自己的应用程序的数据,因此不要使用您的"私有"URL作为intent的目标,而是创建一个特定于组件的Intent并将其作为EXTRA参数提供给您的数据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);
Run Code Online (Sandbox Code Playgroud)

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

Uri privateUri = (Uri) getIntent().getParcelableExtra("DATA_URI");
Run Code Online (Sandbox Code Playgroud)

  • 如果您不是意图的创始人,您将无法做到这一点.所有使用ACTION_VIEW和http方案的意图都应该通过选择浏览器呈现给用户.正如CommonsWare所介绍的那样,让应用程序无意中拦截http意图将是一个巨大的安全漏洞,允许用恶意软件取代付款或银行(例如)URL调用. (4认同)