एंड्रॉइड ब्राउज़र में एक लिंक बनाएं मेरा ऐप शुरू करें?


229

क्या इस तरह लिंक बनाना संभव है:

<a href="anton://useful_info_for_anton_app">click me!</a>

मेरे एंटोन ऐप को शुरू करने का कारण?

मुझे पता है कि यह बाजार प्रोटोकॉल के साथ एंड्रॉइड मार्केट ऐप के लिए काम करता है, लेकिन क्या कुछ अन्य ऐप के साथ भी ऐसा ही किया जा सकता है?

यहां एक लिंक का एक उदाहरण दिया गया है जो एंड्रॉइड मार्केट शुरू करेगा:

<a href="market://search?q=pname:com.nytimes.android">click me!</a>

अपडेट: एल्डारैथिस द्वारा प्रदान किया गया उत्तर मुझे बहुत अच्छा लगता है, लेकिन मैं केवल यह उल्लेख करना चाहता हूं कि मुझे <intent-filter>टैग के सबलेमेंट्स के आदेश से कुछ परेशानी थी । मेरा सुझाव है कि आप <intent-filter>उस समस्या से बचने के लिए उस टैग में नए सबलेमेंट्स के साथ बस एक और बना लें । उदाहरण के लिए मेरे AndroidManifest.xmlइस तरह दिखता है:

<activity android:name=".AntonWorld"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <data android:scheme="anton" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

जब मैंने अपने मोबाइल में एप्लिकेशन नहीं खोला तो मेरी समस्या हल हो गई।
Unomono

9
Xml टैग के आदेश का उल्लेख करने के लिए +1। यह बिल्कुल समझ में नहीं आता है और कहीं भी प्रलेखित नहीं किया गया है, लेकिन मैंने पाया कि जब मेरे पास कार्रवाई और श्रेणी के टैग के नीचे डेटा टैग था, तो यह सिर्फ सादा काम नहीं करेगा।
एडम

ऐप को रीडायरेक्ट करना और सही तरीके से वापस गिरना यदि ऐप मौजूद नहीं है तो सभी अलग-अलग एंड्रॉइड ब्राउज़र (क्रोम, डिफॉल्ट, वेबव्यू, फ़ायरफ़ॉक्स, आदि) की जटिलताओं को देखते हुए एक बुरा सपना भी हो सकता है। Branch.io सेवा ऐसा करने में मदद करता है और नि: शुल्क है।
एलेक्स ऑस्टिन

@ एटन .... हेलो सर ... आपके ऊपर कोड से, मैं केवल लिंक से डेटा को संभालने के लिए समझता हूं ... क्या आप मुझे बता सकते हैं कि मैं एक लिंक कैसे बना सकता हूं जिसमें मेरा डेटा हो ... कृपया मदद करें मुझे ... मैं बटन क्लिक ईवेंट पर डेटा के साथ लिंक बनाना चाहता हूं ..
रवींद्र कुशवाहा

1
⚠️मुझे एक डिबगिंग बाधा के रूप में जाना जाता है, जिसे अन्य लोग भी जानना चाहते हैं: लिंक <a href=""> वेब पेजों में लिंक करते हैं और जब adb के साथ लॉन्च होते हैं, तो काम करते हैं, लेकिन अब जब आप मोबाइल में URL टाइप करते हैं ब्राउज़र पता बार. '
जोहान्स ब्रोडवॉल

जवाबों:


96

मुझे लगता है कि आप <intent-filter>अपने Mainfest फ़ाइल के तत्व को देखना चाहते हैं । विशेष रूप से, <data>उप-तत्व के लिए प्रलेखन पर एक नज़र डालें ।

मूल रूप से, आपको जो करने की आवश्यकता होगी वह आपकी अपनी योजना को परिभाषित करेगा। की तर्ज पर कुछ:

<intent-filter>
    <data android:scheme="anton" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
    ...
</intent-filter>

तब आपको अपने ऐप को उन लिंक के साथ लॉन्च करने में सक्षम होना चाहिए जो anton:यूआरआई योजना से शुरू होते हैं ।


3
इस धागे पर एक नज़र डालने की कोशिश करें। इसका बहुत अच्छा उदाहरण है: stackoverflow.com/questions/2958701/…
eldarerathis

3
संदर्भ के लिए, CATEGORY_BROWSABLE को जोड़ने का अर्थ है कि "लक्ष्य गतिविधि को एक लिंक द्वारा संदर्भित डेटा प्रदर्शित करने के लिए ब्राउज़र द्वारा सुरक्षित रूप से आमंत्रित किया जा सकता है - उदाहरण के लिए, एक छवि या एक ई-मेल संदेश।"
greg7gkb

3
यह पिछले एंड्रॉइड वर्जन पर पूरी तरह से काम करता है, लेकिन लॉलीपॉप पर, कोई समाधान नहीं?
सलमान

1
@eldarerathis यह काम करता है यदि एप्लिकेशन करीब है, लेकिन यदि एप्लिकेशन पृष्ठभूमि पर चल रहा है और गतिविधि एक से भिन्न है, जो इरादे फ़िल्टर संलग्न है तो मैं इसे संभाल नहीं सका। सभी गतिविधियों में काम करने के लिए आप इसे कैसे प्रबंधित करते हैं? क्या आप इन सभी में इंट्रस्ट फिल्टर लगाते हैं?
मुस्तफा गुवेन

5
यह उत्तर पुराना है। यह पोस्ट क्रोम 40 से काम नहीं करेगा। सुरक्षा मुद्दों के कारण कस्टम स्कीम को क्रोम में अक्षम कर दिया गया है
उत्सव गुप्ता

280

कृपया अपनी स्वयं की कस्टम योजना का उपयोग न करें !!! यूआरआई योजनाएं एक नेटवर्क ग्लोबल नेमस्पेस हैं। क्या आप "anton:" योजना के लिए विश्वव्यापी हैं? नहीं? तब इसका उपयोग न करें।

एक विकल्प एक वेब साइट है, और उस वेब साइट पर एक विशेष URI के लिए एक आशय-फ़िल्टर है। उदाहरण के लिए, यह वही है जो मार्केट अपनी वेबसाइट पर यूआरआई को इंटरसेप्ट करने के लिए करता है:

        <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="market.android.com"
                android:path="/search" />
        </intent-filter>

वैकल्पिक रूप से, "आशय:" योजना है। यह आपको यूआरआई के रूप में लगभग किसी भी इरादे का वर्णन करने की अनुमति देता है, जिसे क्लिक करने पर ब्राउज़र लॉन्च करने का प्रयास करेगा। ऐसी योजना बनाने के लिए, सबसे अच्छा तरीका है कि आप जिस उद्देश्य को लॉन्च करना चाहते हैं उसके निर्माण के लिए कोड लिखें, और फिर आशय का परिणाम प्रिंट करें ।toUri (Intent.URI_INTENT_SCHEME)।

आप इस कार्रवाई के लिए किसी भी गतिविधि का समर्थन करने के लिए इस इरादे से एक कार्रवाई का उपयोग कर सकते हैं। सुरक्षा कारणों से ब्राउज़र स्वचालित रूप से लॉन्च करने से पहले इरादे में BROWSABLE श्रेणी जोड़ देगा; यह उसी कारण से आपके द्वारा आपूर्ति किए गए किसी भी स्पष्ट घटक को भी छीन लेगा।

इसका उपयोग करने का सबसे अच्छा तरीका है, यदि आप यह सुनिश्चित करना चाहते हैं कि यह केवल आपके ऐप को लॉन्च करे, तो आपकी स्वयं की स्कैन की गई कार्रवाई के साथ है और यह कहने के लिए Intent.setPackage () का उपयोग करके आशय केवल आपके ऐप पैकेज से मेल खाएगा।

दोनों के बीच व्यापार-नापसंद:

  • http यूआरआई के लिए आपके पास एक डोमेन होना चाहिए। उपयोगकर्ता को हमेशा ब्राउज़र में URI दिखाने का विकल्प मिलेगा। इसमें बहुत अच्छी फ़ॉल-बैक प्रॉपर्टीज़ हैं जहाँ अगर आपका ऐप इंस्टॉल नहीं है, तो वे बस आपकी वेब साइट पर उतरेंगे।

  • आशय URI के लिए आवश्यक है कि आपका ऐप पहले से इंस्टॉल हो और केवल Android फ़ोन पर। लगभग किसी भी इरादे की अनुमति दें (लेकिन हमेशा BROWSABLE श्रेणी में शामिल होना चाहिए और स्पष्ट घटकों का समर्थन नहीं करना चाहिए)। वे आपको केवल ब्राउज़र या किसी अन्य ऐप में जाने के विकल्प के बिना उपयोगकर्ता को लॉन्च करने की अनुमति देते हैं।


32
दूसरी ओर, मार्केट ऐप भी market://लिंक संभालता है :)
फेलिक्स

38
बाजार का उपयोग करने के लिए यह एक गलती थी :, और इसे हटाया जा रहा है।
हैकब

82
एंड्रॉइड में लोग कस्टम स्कीमों का उपयोग करने का कारण बताते हैं, क्योंकि आईफोन संस्करण के साथ (या बाद में) अधिकांश प्रोजेक्ट पार्सल में विकसित किए जाते हैं, और यह वहां काम करने का एकमात्र तरीका है ...
लैम्बर्गा

12
@LambergaR से सहमत हैं। अब हमें 3 प्लेटफार्मों (बीबी,
आईफोन

7
आपके द्वारा कस्टम योजना के साथ आपके वेब पेज में डाला गया कोई भी यूआरआई किसी भी वेब ब्राउज़र पर काम नहीं करेगा जिसमें आपका एप्लिकेशन भी इंस्टॉल नहीं किया गया है। क्या ऐसा नहीं लगता है कि आप टूट गए हैं
हैकबॉड

13

मैं खुद को बढ़ावा देने के लिए माफी चाहता हूं, लेकिन मेरे पास वेब लिंक https://github.com/eusonlito/jquery.applink से मूल एप्लिकेशन लॉन्च करने के लिए एक jQuery प्लगइन है

आप इसे आसानी से उपयोग कर सकते हैं:

<script>
$('a[data-applink]').applink();
</script>

<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>

12

मैंने इस मुद्दे का भी सामना किया और कई बेतुके पृष्ठ देखे। मैंने सीखा है कि अपने एप्लिकेशन को ब्राउज़ करने योग्य बनाने के लिए, XML तत्वों के क्रम को बदलें, यह इस प्रकार है:

<activity
    android:name="com.example.MianActivityName"
    android:label="@string/title_activity_launcher">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>                
        <data android:scheme="http" />     
        <!-- or you can use deep linking like  -->               

        <data android:scheme="http" android:host="xyz.abc.com"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>
</activity>

यह मेरे लिए काम करता है और आपकी मदद कर सकता है।


मैं उसी क्रम में XML टैग लिखता हूं, लेकिन जब मैं एंड्रॉइड ब्राउज़र में अपना url लिखता हूं तो चयनकर्ता संवाद खोलने में सक्षम नहीं होता।
सुनीत कुमार गुप्ता

मुझे बहुत अंतर नहीं दिखाई दिया, और अगर मैं इसे पूरी तरह से काम कर रहा हूँ, तो इसका उपयोग करें .. धन्यवाद :)
मुथु एस

6

यहाँ मेरा नुस्खा है:

एक स्थिर HTML बनाएं जो आपके अनुरोधित ऐप URL पर रीडायरेक्ट करता है, उस पृष्ठ को वेब पर रखें।

इस तरह, आपके द्वारा साझा किए जाने वाले लिंक 'वास्तविक' लिंक हैं जहां तक ​​एंड्रॉइड का संबंध है (वे 'क्लिक करने योग्य' होंगे)।

आप एक नियमित HTTP लिंक 'www.your.server.com/foo/bar.html' साझा करते हैं। यह URL एक साधारण 8 पंक्ति HTML लौटाता है जो आपके ऐप के URI (window.location = "blah: // kuku") पर रीडायरेक्ट करता है। ध्यान दें कि 'ब्लाह' में HTTP या HTTPS नहीं होना चाहिए)।

एक बार जब आप इसे उठाते हैं और चल रहे होते हैं, तो आप ऊपर बताए अनुसार सभी फैंसी क्षमताओं के साथ HTML को बढ़ा सकते हैं।

यह अंतर्निहित ब्राउज़र, ओपेरा और फ़ायरफ़ॉक्स (किसी अन्य ब्राउज़र का परीक्षण नहीं किया गया है) के साथ काम करता है। फ़ायरफ़ॉक्स 'इस लिंक को एक एप्लिकेशन के साथ खोलने की आवश्यकता है' (ठीक है, रद्द करें)। अन्य ब्राउज़र स्पष्ट रूप से सुरक्षा के बारे में चिंता नहीं करते हैं, वे सिर्फ ऐप खोलते हैं, कोई सवाल नहीं पूछा जाता है।


महान! इसने मेरे लिए काम किया। इसलिए हमने कस्टम योजना के लिंक के साथ html पेज जोड़ा जो मेरे ऐप पर रीडायरेक्ट करता है। मेरा लिंक है<a href="iamnearby://register_activate">Activate</a>
एस। कोशेलनेक

4

एक बार जब आप अपने ऐप के लिए इरादा और कस्टम url योजना सेट अप कर लेते हैं, तो एक प्राप्त पृष्ठ के शीर्ष पर इस जावास्क्रिप्ट कोड ने मेरे लिए iOS और Android दोनों पर काम किया है:

<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
    navigator.userAgent.match(/android/i)) {
  var store_loc = "itms://itunes.com/apps/raditaz";
  var href = "/iphone/";
  var is_android = false;
  if (navigator.userAgent.match(/android/i)) {
    store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
    href = "/android/";
    is_android = true;
  }
  if (location.hash) {
    var app_loc = "raditaz://" + location.hash.substring(2);
    if (is_android) {
      var w = null;
      try {
        w = window.open(app_loc, '_blank');
      } catch (e) {
        // no exception
      }
      if (w) { window.close(); }
      else { window.location = store_loc; }
    } else {
      var loadDateTime = new Date();
      window.setTimeout(function() {
        var timeOutDateTime = new Date();
        if (timeOutDateTime - loadDateTime < 5000) {
          window.location = store_loc;
        } else { window.close(); }
      },
      25);
      window.location = app_loc;
    }
  } else {
    location.href = href;
  }
}
</script>

यह केवल एंड्रॉइड ब्राउज़र पर परीक्षण किया गया है। मैं फ़ायरफ़ॉक्स या ओपेरा के बारे में निश्चित नहीं हूं। कुंजी तब भी है जब एंड्रॉइड ब्राउज़र आपके लिए एक अच्छा अपवाद नहीं फेंकेगा window.open(custom_url, '_blank'), यह विफल हो जाएगा और वापस आ जाएगा nullजिसे आप बाद में परीक्षण कर सकते हैं।

अपडेट: store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";Android पर Google Play से लिंक करने के लिए उपयोग करना।


1
लोड डेटाइम / टाइमऑउटडेटेट का बिंदु क्या है? क्या यह किसी तरह पॉपअप ब्लॉकर्स या कुछ के आसपास मिलता है?
मैट वोल्फ

यह मेरे परीक्षणों में काम नहीं करता है, window.open (...) हमेशा एक नई विंडो खोलेगा, भले ही योजना को संभाला न हो।
jtomson

@MattWolfe देर से जवाब के लिए खेद है। IPhone (Safari) पर कोई अपवाद नहीं फेंका गया है। सफ़ारी में बासी खिड़की को बंद करने के लिए समय समाप्त हो गया है जो पृष्ठ को ऐप पर पुनर्निर्देशित करने के बाद बचा हुआ है। मुझे सफारी के माध्यम से जाने के बिना एक यूआरएल खोलने का रास्ता नहीं मिला है और इस तरह के यूआरएल को पहचानने वाले अधिकांश अन्य ऐप भी यही काम करते हैं। यह फेसबुक से "डीप लिंकिंग" के फायदों में से एक था: आपको मोबाइल सफारी के माध्यम से उस बासी बचे हुए खिड़की से नहीं मिलता है।
पीट

@jtomson: दिलचस्प है। मैंने एंड्रॉइड 2.1 से 3 (समय पर) एमुलेटर और विभिन्न उपकरणों पर परीक्षण किया। आप किस उपकरण और Android संस्करण पर परीक्षण कर रहे थे?
पीट

4

आप अपने ऐप की गहरी लिंक को संभालने के लिए लाइब्रेरी पर विचार करना चाहते हैं:

https://github.com/airbnb/DeepLinkDispatch

आप एक एनोटेट गतिविधि पर इरादा फ़िल्टर जोड़ सकते हैं जैसे ऊपर सुझाए गए लोग। यह आपके सभी गहरे लिंक के लिए मापदंडों के मार्ग और पार्सिंग को संभाल लेगा। उदाहरण के लिए, आपकी MainActivity में ऐसा कुछ हो सकता है:

@DeepLink("somePath/{useful_info_for_anton_app}")
public class MainActivity extends Activity {
   ...
}

यह क्वेरी पैरामीटर भी संभाल सकता है।


1

मेरी सरल चाल की कोशिश करो:

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("classRegister:")) {                  
                Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
            }               
            view.loadUrl(url);
            return true;
        }

और मेरा HTML लिंक:

<a href="classRegister:true">Go to register.java</a>

या आप कर सकते हैं <a href = "classRegister: सच "> <- "सही" वर्ग फ़ाइल नाम के लिए मूल्य

हालांकि यह स्क्रिप्ट mailto लिंक के लिए काम :)

        if (url.startsWith("mailto:")) {
            String[] blah_email = url.split(":");
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
            Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
            startActivity(emailIntent);
        }

यह अनिवार्य रूप JavascriptInterfaceसे वर्कअराउंड के साथ एक कॉल है , यह सही वर्कअराउंड है यदि आपको 2.3 का समर्थन करने की आवश्यकता है जहां जावास्क्रिप्टइंटरफेस को बंद कर दिया गया है।
इपिकपांडाफर्स

1

यह विधि आपसे या तो आपके ऐप या ब्राउज़र को खोलने के लिए कह रही अव्यवस्था संवाद को कॉल नहीं करती है।

यदि आप अपने घोषणापत्र में निम्नलिखित को पंजीकृत करते हैं

<manifest package="com.myApp" .. >
  <application ...>
    <activity ...>
      <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:host="gallery"
          android:scheme="myApp" />
      </intent-filter>
    </activity>
    ..

और उदाहरण के लिए अपने फोन पर एक ईमेल से इस यूआरएल पर क्लिक करें

<a href="intent://gallery?directLink=true#Intent;scheme=myApp;package=com.myApp;end"> 
  Click me 
</a>

तब android पैकेज com.myApp के साथ एक ऐप खोजने की कोशिश करेगा, जो आपकी गैलरी के इरादे का जवाब देता है और एक myApp स्कीम है। यदि ऐसा नहीं हो सकता है, तो यह आपको com.myApp की तलाश में स्टोर पर ले जाएगा , जो आपका ऐप होना चाहिए।


एंड्रॉइड गतिविधि पर कैसे जाएं?
मोहसिन इमामी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.