将URI与<data>匹配,例如AndroidManifest中的http://example.com/something </data>

时间:2014-07-21 23:45:07

标签: android regex android-manifest android-xml deep-linking

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

我主要使用

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

<data android:pathPattern="/..*/" />

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

如何排除这些?

3 个答案:

答案 0 :(得分:8)

不幸的是,可用于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>

如果您不希望自己的活动检查数据是否正确,则必须更改您的要求。

答案 1 :(得分:4)

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

<data android:scheme="http" android:host="example.com" android:path="/something" />
<data android:scheme="http" android:host="example.com" android:pathPrefix="/foo" />

答案 2 :(得分:-6)

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

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

查看DEMO