2016-04-20 5 views
1

Я бы хотел, чтобы мое приложение обрабатывало следующий настраиваемый url myscheme://product?id=123. Это работает как ожидалось. Тем не менее, следующий URL-адрес также обрабатывается myscheme://product/something/else?id=123 Как предотвратить использование второго URL-адреса приложением?Intent-filter pathPattern для пользовательской схемы

я настроить намеренный фильтр, который обрабатывает глубокую связь, как следующее манифеста

<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> 

Я только начал играть с глубоким связыванием так что любая помощь будет принята с благодарностью!

ответ

2

Попробуйте заменить. * С .product? * Это должно выровнять фильтр только строки запроса продукта, а не продукт URL путь (/ продукт/что-то/другое? 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 

UPDATE: ключевым моментом здесь является использование GetData() не получить дополнительные услуги(). Стало известно, что трудный путь :)

@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(); 
     } 
    } 
} 

Split 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()); 
    } 
} 

UPDATE: Нашел библиотека, которая делает то же самое, стоит отметить, не использовали его, но я могу дать это попытка: https://android-arsenal.com/details/1/2072

+0

Спасибо за ввод, но это не сработало. –

+0

Вы имеете в виду, что проблема не устранена, или это заставило функцию не работать вообще? – DoctorD

+0

Это заставило функцию не работать. Ссылка 'product? Id = 1' всегда приводит к игровому магазину, а не к обработке в приложении. –

Смежные вопросы