मेरे Android ऐप को खोलने के लिए ब्राउज़र से लिंक को इंटरसेप्ट करना


107

जब उपयोगकर्ता ब्राउज़र को खोलने की अनुमति देने के बजाय किसी दिए गए पैटर्न के URL पर क्लिक करता है, तो मैं अपने ऐप को एक लिंक खोलने के लिए संकेत देना चाहूंगा। यह तब हो सकता है जब उपयोगकर्ता ब्राउज़र में एक वेब पेज पर या ईमेल क्लाइंट में या किसी वेबव्यू के भीतर एक ताज़ा-ताज़ा ऐप में होता है।

उदाहरण के लिए, फ़ोन में कहीं से भी YouTube लिंक पर क्लिक करें और आपको YouTube ऐप खोलने का मौका दिया जाएगा।

मैं अपने स्वयं के ऐप के लिए इसे कैसे प्राप्त करूं?


जवाबों:


141

एक android.intent.action का उपयोग करें । श्रेणी का देखें android.intent.category.BROWSABLE

रोमेन गाइ के फोटोस्ट्रीम ऐप के AndroidManifest.xml से ,

    <activity
        android:name=".PhotostreamActivity"
        android:label="@string/application_name">

        <!-- ... -->            

        <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="http"
                  android:host="flickr.com"
                  android:pathPrefix="/photos/" />
            <data android:scheme="http"
                  android:host="www.flickr.com"
                  android:pathPrefix="/photos/" />
        </intent-filter>
    </activity>

एक बार जब आप गतिविधि में होते हैं , तो आपको कार्रवाई देखने की आवश्यकता होती है, और फिर आपके द्वारा सौंपे गए URL के साथ कुछ करें। Intent.getData()विधि आप एक उरी देता है।

    final Intent intent = getIntent();
    final String action = intent.getAction();

    if (Intent.ACTION_VIEW.equals(action)) {
        final List<String> segments = intent.getData().getPathSegments();
        if (segments.size() > 1) {
            mUsername = segments.get(1);
        }
    }

हालांकि, यह ध्यान दिया जाना चाहिए कि यह एप्लिकेशन थोड़ा पुराना हो रहा है (1.2), इसलिए आप पा सकते हैं कि इसे प्राप्त करने के बेहतर तरीके हैं।


8
एक चीज के बारे में पता होना चाहिए - आपके उपयोगकर्ता को उपयुक्त ऐप का उपयोग करने के विकल्प के साथ प्रस्तुत किया जाएगा क्योंकि आप जो भी करते हैं वह आपके ऐप को एक हैंडलर के रूप में पंजीकृत करना है। व्यक्तिगत रूप से (उपयोगकर्ता के रूप में) मैं इस बात से नाराज़ हूं कि मुझे एहसास है कि मैं "डिफ़ॉल्ट कार्रवाई" का विकल्प चुन सकता हूं
बोसोन

1
यह एचटीसी फोन के लिए काम नहीं करता है। मैं इसे एचटीसी फोन पर कैसे काम कर सकता हूं?
user484691

57
यदि आप querystring सहित पूर्ण URL की परवाह करते हैं, तो आप संभवतः getData () के बजाय इरादे .getDataString () का उपयोग करना चाहेंगे। यह टिप्पणी आपको उस घंटे को बचाएगी, जो मेरे लिए खर्च होती है .....:
केंटन मूल्य

क्या यह प्रत्येक URL के लिए कहा जाएगा जो उपयोगकर्ता किसी भी ऐप या केवल मूल ब्राउज़र से नेविगेट करता है?
गोंजोब्राईंस

1
किसी भी ऐप से (जो Intent.ACTION_VIEW इरादे का उपयोग करता है)
jamesh

2

Url से कुछ पुस्तकालयों पार्स पैरामीटर स्वचालित रूप से हैं।

जैसे कि

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

बाद में एक मेरे द्वारा लिखा गया है। जो दिए गए प्रकार के मापदंडों को पार्स कर सकता है, हमेशा स्ट्रिंग नहीं।

उदाहरण

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);

0
private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        setUrlparams(url);

        if (url.indexOf("pattern") != -1) {
            // do something
            return false;
        } else {
            view.loadUrl(url);
        }

        return true;
    }

}

4
धन्यवाद। यह उस संदर्भ में उपयोगी है जहां आप वेबव्यू के मालिक हैं। जो सवाल मैं पूछ रहा था, वह यह है कि मुझे अपने ऐप को किसी भी ऐप (जैसे ब्राउज़र) में एक लिंक पर क्लिक करने के लिए कैसे रोकना है।
१h:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.