2014-07-21 6 views
9

में http://example.com/something जैसे मैं अपने यूआरआई मिलान काम करने के लिए AndroidManifest.xml फ़ाइल में <data> तत्व के साथ संघर्ष कर रहा हूं। मैं निम्नलिखित यूआरआई मिलान करना चाहते हैं:<data> के साथ यूआरआई मैच करें जैसे एंड्रॉइडमैनीफेस्ट

लेकिन नहीं

मैं यह ज्यादातर

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

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

के साथ काम मिल गया लेकिन यह अभी भी http://example.com/something/else मेल खाता है।

मैं इन्हें कैसे बाहर निकाल सकता हूं?

+0

समस्या '*' है जो "बाकी सब कुछ" के लिए वाइल्डकार्ड है। इसे हटाने का प्रयास करें, और देखें कि यह काम करता है या नहीं! – Leonardo

+0

@ लियोनार्डो फेरारी हां, लेकिन वाइल्डकार्ड भी दो या एक से आगे के स्लैश के बीच सभी प्रकार के पात्रों से मेल खाना आवश्यक है। – Mahoni

+0

मुझे खेद है कि इससे मदद नहीं मिलती है, लेकिन यहां एक [रेगेक्स जो आपके अभिवादन के लिए काम करता है] (http://regex101.com/r/rT5rZ5/1)। मुझे नहीं पता कि इससे मदद मिलती है क्योंकि मुझे एंड्रॉइड नहीं पता है। उम्मीद है कि यह थोड़ा और अच्छी किस्मत में मदद करता है! – skamazin

उत्तर

8

पर एक नज़र डालें।

ऐसा इसलिए है क्योंकि एक बार जब आप "/.*" स्वीकार करते हैं तो सब कुछ स्वीकार हो जाता है (जिसमें स्लेश शामिल हैं)। और चूंकि हम डेटा टैग प्रदान नहीं कर सकते हैं जिन्हें स्वीकार नहीं किया जा सकता है, केवल एक ही तरीका है कि आप अपनी गतिविधि के अंदर डेटा जांचें। प्रकट अंदर

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

आप की जाँच करने के अपनी गतिविधि नहीं करना चाहते हैं, तो डेटा सही है आप करेंगे अपनी आवश्यकताओं को बदलना है।

+4

इस समाधान के साथ समस्या यह है कि आपकी गतिविधि के बाद इरादा प्राप्त हुआ, अगर यह इसके साथ कुछ नहीं करता है, तो अन्य गतिविधियों को इसे प्राप्त करने का मौका नहीं मिलेगा। –

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

यहाँ आप कहते हैं कि एक स्लेश \/ (के बाद से स्लैश भाग निकले किया जाना चाहिए) 1 या अधिक शब्द चरित्र के बाद बाद में वहाँ एक और स्लेश हो सकता है नहीं होगा (लेकिन यह वैकल्पिक है) स्ट्रिंग

के अंत में

दुर्भाग्य वाइल्डकार्ड कि pathPattern टैग के लिए इस्तेमाल किया जा सकता बहुत ही सीमित हैं और क्या आप चाहते हैं शुद्ध एक्सएमएल के माध्यम से वर्तमान में असंभव है DEMO

+0

मुझे नहीं लगता कि ये regexp वर्ण कानूनी हैं। प्लस पहले से ही काम नहीं करता है। – Mahoni

+0

ओह मैनिफेस्ट केवल स्वीकार करता है। * और http://stackoverflow.com/questions/4762251/android-matching-a-url-pattern के अनुसार \\ से बचें, ऐसा लगता है कि आपका कार्य संभव नहीं है तो – gaw

4

जब तक आपके पास पकड़ने के पथों के बहुत से संभावित भिन्नताएं न हों, तो उन सभी को स्पष्ट रूप से घोषित करें (path औरका उपयोग करके) बहुत व्यापक पैटर्न से बचने के लिए।

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

एंड्रॉइड: पथ और एंड्रॉइड: pathPrefix मान '/' से शुरू होना चाहिए। – Thupten

+0

दरअसल, अब तय किया गया। –

संबंधित मुद्दे