使用AndroidManifest中的http://example.com/something与<data>匹配URI

我正在使用AndroidManifest.xml文件中的<data>元素来使我的URI匹配工作。 我想匹配以下URI:

  • http://example.com/something
  • http://example.com/foo
  • http://example.com/foo/

不是

  • http://example.com
  • http://example.com/
  • http://example.com/something/else

我主要是与它合作

 <data android:scheme="http" android:host="example.com" android:pathPattern="/..*" /> <data android:pathPattern="/..*/" /> 

但它仍然匹配http://example.com/something/else

我怎样才能排除这些?

Solutions Collecting From Web of "使用AndroidManifest中的http://example.com/something与<data>匹配URI"

不幸的是,可用于pathPattern标签的通配符是非常有限的,你想要的是通过纯XML现在是不可能的。

这是因为一旦你接受"/.*"一切都被接受(包括斜线)。 而且,由于我们无法提供不被接受的数据标签,唯一的方法就是检查活动内部的数据。 以下是如何完成您的工作:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Uri data = getIntent().getData(); Log.d("URI", "Received data: " + data); String path = data.getPath(); // Match only path "/*" with an optional "/" in the end. // * to skip forward, backward slashes and spaces Pattern pattern = Pattern.compile("^/[^\\\\/\\s]+/?$"); Matcher matcher = pattern.matcher(path); if (!matcher.find()) { Log.e("URI", "Incorrect data received!"); finish(); return; } // After the check we can show the content and do normal stuff setContentView(R.layout.activity_main); // Do something when received path data is OK } 

清单内的活动看起来像这样:

 <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" android:host="example.com" android:pathPattern="/.*"/> </intent-filter> </activity> 

如果你不希望你的活动检查数据是否正确,你将不得不改变你的要求。

除非您想要捕捉的path有很多可能的变体,否则只需明确地声明所有path (使用pathpathPrefix )以避免过宽的模式。

 <data android:scheme="http" android:host="example.com" android:path="/something" /> <data android:scheme="http" android:host="example.com" android:pathPrefix="/foo" /> 
  <data android:scheme="http" android:host="example.com" android:pathPattern="\/[\w]+\/?$" /> 

在这里你会说有一个斜杠\/ (因为斜杠必须被转义),后面跟着一个或多个单词字符,在string的末尾可能会有一个斜杠(但是这是可选的)

看看DEMO