用于自定义方案的Intent-filter pathPattern

时间:2016-04-20 12:55:55

标签: android intentfilter

我希望我的应用处理以下自定义网址myscheme://product?id=123。这是按预期工作的。但是,以下网址也会被处理myscheme://product/something/else?id=123如何阻止第二个网址被应用处理?

我设置了处理深层链接的intent-filter,如清单

中的后续内容
<intent-filter>
     <action android:name="android.intent.action.VIEW"/>

     <category android:name="android.intent.category.DEFAULT"/>
     <category android:name="android.intent.category.BROWSABLE"/>

     <data android:scheme="myscheme"/>
     <data android:host="product"/>
     <data android:pathPattern=".*"/>
</intent-filter>

我刚刚开始玩深度链接,所以任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:2)

尝试将。*替换为.product?*这应该使过滤器只与产品查询字符串对齐,而不是产品网址路径(/ product / something / else?id)

<intent-filter>
 <action android:name="android.intent.action.VIEW"/>

 <category android:name="android.intent.category.DEFAULT"/>
 <category android:name="android.intent.category.BROWSABLE"/>

 <data android:scheme="myscheme"/>
 <data android:host="product"/>
 <data android:pathPattern=".product?*"/>

另一种选择是创建两个意图过滤器,并按照收据意图的顺序放置它们:

Intent 1: product/something/else
Intent 2: product?id=1

更新:这里的关键是使用getData()而不是获取extras()。学到了很难的方法:)

@Override
public void onNewIntent(Intent i) {
    super.onNewIntent(i);
    Bundle b = i.getExtras();
    if (i != null && i.getData() != null) {
    try {
            Uri data = i.getData();
            Map<String, String> a = splitQuery(data);
            if (a.containsKey("Product") && a.containsKey("SOMETHINGELSE")){
                //todo:something that takes care of something else: 
            }else if (a.containsKey("Product")){
                mItemNumber = a.get("ID");
                setUpFragmentForItem(mItemNumber);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

将URI拆分为细分:

public static Map<String, String> splitQuery(Uri url) throws UnsupportedEncodingException {
    try {
        Map<String, String> query_pairs = new LinkedHashMap<String, String>();
        String query = url.getQuery();
        String[] pairs = query.split("/");
        for (String pair : pairs) {
            int idx = pair.indexOf("=");
            query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
        }
        return query_pairs;
    } catch (Exception e) {
        throw new UnsupportedEncodingException(e.getMessage());
    }
}

更新:找到一个同样的东西,值得一提,但没有使用它的库,但我可以尝试一下: https://android-arsenal.com/details/1/2072