Android ब्राउज़र से कस्टम Android एप्लिकेशन लॉन्च करें


416

क्या कोई मुझे एंड्रॉइड ब्राउज़र से अपना एंड्रॉइड एप्लिकेशन लॉन्च करने के बारे में मार्गदर्शन कर सकता है?

जवाबों:


616

<intent-filter>एक <data>तत्व के साथ प्रयोग करें । उदाहरण के लिए, twitter.com करने के लिए सभी लिंक प्रबंधित करने के लिए, आप अपने अंदर डाल चाहते हैं <activity>अपने में AndroidManifest.xml:

<intent-filter>
    <data android:scheme="http" android:host="twitter.com"/>
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

फिर, जब उपयोगकर्ता ब्राउज़र में ट्विटर के लिंक पर क्लिक करता है, तो उनसे पूछा जाएगा कि कार्रवाई को पूरा करने के लिए किस एप्लिकेशन का उपयोग करना है: ब्राउज़र या आपका एप्लिकेशन।

बेशक, यदि आप अपनी वेबसाइट और अपने ऐप के बीच कड़ा एकीकरण प्रदान करना चाहते हैं, तो आप अपनी योजना को परिभाषित कर सकते हैं:

<intent-filter>
    <data android:scheme="my.special.scheme" />
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

फिर, अपने वेब ऐप में आप लिंक डाल सकते हैं जैसे:

<a href="my.special.scheme://other/parameters/here">

और जब उपयोगकर्ता इसे क्लिक करता है, तो आपका ऐप स्वचालित रूप से लॉन्च हो जाएगा (क्योंकि यह संभवतः केवल एक ही होगा my.special.scheme://जो यूरिस के प्रकार को संभाल सकता है )। इसका नकारात्मक पक्ष यह है कि यदि उपयोगकर्ता के पास ऐप इंस्टॉल नहीं है, तो उन्हें एक गंदा त्रुटि मिलेगी। और मुझे यकीन नहीं है कि जाँच करने का कोई तरीका है।


संपादित करें: अपने प्रश्न का उत्तर देने के लिए, आप getIntent().getData()एक Uriवस्तु का उपयोग कर सकते हैं । फिर Uri.*आप अपनी ज़रूरत के डेटा को निकालने के लिए विधियों का उपयोग कर सकते हैं । उदाहरण के लिए, मान लें कि उपयोगकर्ता ने किसी लिंक पर क्लिक किया है http://twitter.com/status/1234:

Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"

आप अपने में कहीं भी ऊपर कर सकते हैं Activity, लेकिन आप शायद इसे अंदर करना चाहते हैं onCreate()। आप params.size()पथ सेगमेंट की संख्या प्राप्त करने के लिए भी उपयोग कर सकते हैं Uri। अन्य Uriतरीकों के लिए javadoc या Android डेवलपर वेबसाइट देखें, जिनका उपयोग आप विशिष्ट भागों को निकालने के लिए कर सकते हैं।


6
आपके शीघ्र उत्तर के लिए एक टन धन्यवाद। लेकिन क्या आप मुझे बता सकते हैं कि "my.special.scheme: //" के बाद पैरामीटर कैसे एक्सेस करें।
परिमल मोदी

4
मैंने उड़ी से डेटा निकालने के निर्देश को शामिल करने के लिए अपना जवाब संपादित किया है। कृपया इस उत्तर को स्वीकृत (केवल) के रूप में चिह्नित करें यदि आप इस पर विचार करते हैं तो इसके बगल में स्थित चेकमार्क पर क्लिक करके।
फेलिक्स

9
क्या होगा अगर लक्षित Android आवेदन स्थापित नहीं है? इसे कैसे संभालना है।
निमो

13
जो कोई भी, मेरी तरह, इस योजना को काम पाने में असमर्थ है, को प्रकट रूप में जोड़ना android:exported="true"होगा Activity। इस उत्तर की जाँच करें stackoverflow.com/a/13044911/1276636
सूफ़ियान

4
यकीन नहीं होता कि यह पूरी दुनिया के लिए कैसे काम कर रहा है। बस क्रोम पर काम नहीं करता है और यह हमेशा ब्राउज़र में लिंक को खोलता है जब तक कि आप "एंड्रॉइड: पाथप्रिफ़िक्स" तत्व नहीं डालते। उत्तर वैसे भी दस्तावेज में वर्णित श्रेणी मान नहीं है। यदि यह अभी भी किसी के लिए काम नहीं करता है, तो कृपया इसे देखें: stackoverflow.com/a/21727055/2695276 PS: इस पर दिनों के लिए संघर्ष किया।
रजत शर्मा

70

उपरोक्त सभी उत्तर मेरे लिए २ answers CHROMEजनवरी २०१४ से काम नहीं कर रहे थे

मेरे ऐप को http://example.com/someresource/ से ठीक से लॉन्च किया गया , जैसे हैंगआउट, जीमेल आदि ऐप से, लेकिन क्रोम ब्राउज़र से नहीं।

इसे हल करने के लिए, ताकि यह CHROME से ठीक से लॉन्च हो जाए, आपको इस तरह का इरादा फ़िल्टर सेट करना होगा

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

pathPrefixतत्व पर ध्यान दें

जब भी उपयोगकर्ता Google खोज परिणामों या किसी अन्य वेबसाइट के लिंक पर क्लिक करके क्रोम ब्राउज़र से http://example.com/someresource/ पैटर्न का अनुरोध करता है, तो आपका ऐप गतिविधि पिकर के अंदर दिखाई देगा।


इससे मुझे बहुत मदद मिली। आपका बहुत बहुत धन्यवाद! कृपया अपना जवाब यहाँ पोस्ट करें ताकि मैं आपको इनाम दे सकूँ! stackoverflow.com/questions/21663001/…
व्लाद श्नकोवस्ज़की

यह कौनसी भाषा है?
Dims

हैलो, मैं जानता हूँ कि यह बहुत पुराना है। मैं भी उसी परिदृश्य में मारा गया हूं। मेरे पास पथप्रिफ़िक्स, योजना और होस्ट निर्दिष्ट हैं, लेकिन यह काम नहीं कर रहा है। मैंने केवल योजना के साथ प्रयास किया, तब इसने काम किया। लेकिन जब मैंने होस्ट को जोड़ा, तो इसने काम करना बंद कर दिया। किसी भी विचार क्या मुद्दा हो सकता है?
सीमा

जब तक मैं इस जवाब पर नहीं आया तब तक इस पर खर्च किया। यह निश्चित नहीं है कि पथप्रिंस तत्व के बिना पूरी दुनिया के लिए यह कैसे काम करता है। प्रलेखन के अनुसार सब कुछ करने के बावजूद मैंने कभी क्रोम पर काम नहीं किया। बहुत बहुत धन्यवाद।
रजत शर्मा

66

कृपया मेरी टिप्पणी यहां देखें: एंड्रॉइड ब्राउज़र में एक लिंक बनाएं मेरा ऐप शुरू करें?

हम लोगों को अपनी योजनाओं का उपयोग करने से दृढ़ता से हतोत्साहित करते हैं, जब तक कि वे एक नई विश्वव्यापी इंटरनेट योजना को परिभाषित नहीं कर रहे हैं।


10
हैकबोड एंड्रॉइड प्लेटफॉर्म के पीछे Google इंजीनियरों में से एक है। इस सलाह का पालन करना शायद एक अच्छा विचार है। वास्तव में, ऐसा लगता है कि कस्टम स्कीम का समर्थन इस तरह से हनीकॉम्ब में टूट गया।
nmr

23
IOS द्वारा डेवलपर्स पर लगाए गए सीमाओं के लिए मुझे जिम्मेदार नहीं ठहराया जा सकता है। ;)
हैकबोड

12
जिम्मेदार ठहराया? नहीं। लेकिन आप इसे ध्यान में रख सकते हैं, भले ही आप इसे पसंद करें या न करें, उन सीमाओं को आपके कई डेवलपर्स पर लगाया जाता है
बाइटमे

6
हैकबॉड विशेष रूप से एंड्रॉइड के लिए एक सवाल का जवाब दे रहा है। आईओएस का कोई उल्लेख नहीं है, इसलिए इसे ध्यान में रखने की आवश्यकता नहीं है।
nilskp

4
@hackbod एक योजना को नामांकित करेगा (यानी href = "com.ourdomain.myapp // जो भी हो") एक अच्छा अभ्यास, यह मानते हुए कि इस तरह की लिंक विभिन्न वेबसाइटों पर मिल सकती है?
जूलियन बेयरुबे

48

मेरे मामले में मुझे दो श्रेणियों के लिए सेट करना पड़ा <intent-filter>और फिर इसने काम किया:

<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>

2
यहां भी, अतिरिक्त श्रेणी को जोड़ने की आवश्यकता है।
केपीके

क्या कोई समझा सकता है कि इसे पूरा करने की वास्तविक प्रक्रिया क्या है? सटीक कार्यान्वयन के लिए कोई भी लिंक, आवश्यक शर्तें मददगार होंगी। साभार
अंकित गर्ग

देव सेटअप पर परीक्षण किया गया। दरअसल मैं एक गलत डोमेन नाम दे रहा था। मेरी गलती।
अंकित गर्ग

शीर्ष रेटेड उत्तर ने मेरे लिए काम नहीं किया, लेकिन यह किया। धन्यवाद।
ईएल 45 ऑक्ट

25

उदाहरण के लिए, आपके पास अगली चीजें हैं:

अपने ऐप को खोलने के लिए एक लिंक: http://example.com

आपके ऐप का पैकेज नाम: com.example.mypackage

फिर आपको आगे क्या करना है:

1) अपनी गतिविधि में एक आशय फ़िल्टर जोड़ें (कोई भी गतिविधि जो आप चाहते हैं। अधिक जानकारी के लिए दस्तावेज़ देखें )।

        <activity
        android:name=".MainActivity">

        <intent-filter android:label="@string/filter_title_view_app_from_web">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <!-- Accepts URIs that begin with "http://example.com" -->

            <data
                android:host="example.com"
                android:scheme="http" />
        </intent-filter>

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

    </activity> 

2) लिंक का परीक्षण करने या इस विधियों का उपयोग करने के लिए एक HTML फ़ाइल बनाएं

<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>

<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>

3) परीक्षण करने के लिए मोबाइल क्रोम का उपयोग करें

4) यही बात है।

और इसकी कड़ी जोड़ने के लिए बाजार में एप्लिकेशन प्रकाशित करना आवश्यक नहीं है =)

इसके अलावा, अधिक जानकारी के लिए, प्रलेखन और उपयोगी प्रस्तुति की जांच करें ।


मुझे HTML फ़ाइल बनानी थी और उसे काम करने के लिए अपलोड करना था। मुझे आश्चर्य है कि, क्यों जासूसी दूसरे, एक ब्राउज़र (क्रोम) से सीधे काम नहीं करता है।
मकाले

18

<category android:name="android.intent.category.BROWSABLE"/>लिंक से गतिविधि को ठीक से पहचानने के लिए इरादे फ़िल्टर में भी जोड़ा जाना चाहिए ।


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

क्या यह एक मौजूदा श्रेणी है या आप एक नया प्रस्ताव दे रहे हैं?
अनिश

वह मौजूद है। जाहिरा तौर पर आपके पास अलग-अलग इरादे-फ़िल्टर टैग में अलग-अलग वेबसाइट होस्ट होनी चाहिए, या यह समस्याओं का कारण बनता है।
NoBugs 20

2
न केवल BROWSABLE, बल्कि android.intent.category.DEFAULTULT - इसलिए लिंक को अन्य एप्स में शुरू किए जाने पर खोला जा सकता है, जैसे ईमेल (सिर्फ ब्राउजर नहीं)
AlikElzin-kilaka

8

निम्न लिंक सीधे ब्राउज़र से ऐप लॉन्च करने (यदि स्थापित है) की जानकारी देता है। अन्यथा यह सीधे ऐप को प्ले स्टोर में खोल देता है ताकि उपयोगकर्ता मूल रूप से डाउनलोड कर सके।

https://developer.chrome.com/multidevice/android/intents


7

कृपया ध्यान दें कि जब आप इस सुविधा को लागू करते हैं, तो आपका आइकन एंड्रॉइड लॉन्चर से गायब हो जाता है, जबकि आपको इरादे-फ़िल्टर को विभाजित करना पड़ता है।

    <activity
        android:name=".MainActivity"
        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>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="your-own-uri" />
        </intent-filter>
    </activity>

6

हाँ, Chrome योजना खोजने के बजाय खोज करता है। अगर आप अपने ऐप को URI स्कीम के माध्यम से लॉन्च करना चाहते हैं, तो प्ले स्टोर पर इस कूल यूटिलिटी ऐप का उपयोग करें। इसने मेरा दिन बचा लिया :) https://play.google.com/store/apps/details?id=com.naosim.urlshemhemender


5

फेलिक्स का ज़मारिन बंदरगाह के जवाब

अपने में MainActivity, इसे जोड़ें ( डॉक्स: Android.App.IntentFilterAttribute क्लास ):

....
[IntentFilter(new[] { 
    Intent.ActionView }, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, 
    DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
    ....

Xamarin आपके लिए निम्नलिखित जोड़ देगा AndroidManifest.xml:

<activity
    android:label="Something"
    android:screenOrientation="portrait"
    android:theme="@style/MyTheme"
    android:name="blah.MainActivity">
    <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="my.special.scheme" />
    </intent-filter>
</activity>

और परम प्राप्त करने के लिए ( मैंने मेनकैक्टिविटी के ऑनक्रिएट में परीक्षण किया ):

var data = Intent.Data;
if (data != null)
{
    var scheme = data.Scheme;
    var host = data.Host;
    var args = data.PathSegments;

    if (args.Count > 0)
    {
        var first = args[0];
        var second = args[1];
        ...
    }
}

जहां तक ​​मुझे पता है, मेनएक्टिविटी ही नहीं, किसी भी गतिविधि में ऊपर जोड़ा जा सकता है

टिप्पणियाँ:

  1. जब उपयोगकर्ता लिंक पर क्लिक करता है, तो एंड्रॉइड ओएस आपके ऐप को फिर से लॉन्च करता है (मारना मिस इंस्टेंस, यदि कोई हो, और नया चलाएं) , तो इसका मतलब है कि OnCreateऐप की घटना MainLauncher Activityफिर से निकाल दी जाएगी।
  2. इस लिंक के साथ: <a href="my.special.scheme://host/arg1/arg2">ऊपर अंतिम स्निपेट मूल्यों में होगा:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

अपडेट: यदि एंड्रॉइड आपके ऐप का नया उदाहरण बनाता है, तो आपको android:launchMode="singleTask"भी जोड़ना चाहिए ।


3

डीप लिंक्स को हैंडल करने के लिए फेलिक्स का दृष्टिकोण डीप लिंक से निपटने का विशिष्ट तरीका है। मैं आपके गहरे लिंक के रूटिंग और पार्सिंग को संभालने के लिए इस लाइब्रेरी की जाँच करने का सुझाव भी दूंगा:

https://github.com/airbnb/DeepLinkDispatch

आप किसी विशेष डीप लिंक URI के लिए अपनी गतिविधि को पंजीकृत करने के लिए एनोटेशन का उपयोग कर सकते हैं, और यह पथ खंडों को प्राप्त करने, इसे मिलान करने, आदि के सामान्य रिगर्मेल करने के बिना आपके लिए मापदंडों को निकालेगा, आप बस एनोटेट और गतिविधि की तरह कर सकते हैं :

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

0

अरे मुझे इसका हल मिल गया। मैंने श्रेणी को "डिफ़ॉल्ट" के रूप में सेट नहीं किया था। इसके अलावा मैं आशय डेटा के लिए मुख्य गतिविधि का उपयोग कर रहा था। अब मैं आशय डेटा के लिए एक अलग गतिविधि का उपयोग कर रहा हूं। सहायता के लिए धन्यवाद। :)


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

0

आपको CALLBACK_URL ऐप में एक छद्म होस्टनाम जोड़ने की आवश्यकता है: // 'एक URL के रूप में समझ में नहीं आता है और इसे पार्स नहीं किया जा सकता है।


0

example.php:

<?php
if(!isset($_GET['app_link'])){  ?>   
    <iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <?php 
}
else { ?>
    <script type="text/javascript">
    self.window.location        = '<?php echo $_GET['app_link'];?>';
    window.parent.location.href = '<?php echo $_GET['full_link'];?>';
    </script>
<?php 
}

1
यह दो अदृश्य iframes बनाता है: गहरी लिंक और सामान्य लिंक। यदि ऐप इंस्टॉल हो गया है, तो गहरी लिंक iframe इसे लॉन्च करेगी। यदि नहीं, तो सामान्य लिंक प्रदर्शित होता है। कुछ अतिरिक्त काम के साथ, डीफ़र्ड डीप लिंकिंग को लागू किया जा सकता है, जहाँ ऐप इंस्टॉल होने के बाद डीप लिंक कहा जाता है।
डोमिनिक सेरिसानो

0

यहाँ @JRuns उत्तर देखें । विचार यह है कि अपनी कस्टम स्कीम के साथ html बनाएं और इसे कहीं अपलोड करें। फिर यदि आप अपने html-file पर अपने कस्टम लिंक पर क्लिक करते हैं, तो आप अपने ऐप पर रीडायरेक्ट हो जाएंगे। मैंने इस लेख को Android के लिए उपयोग किया है । लेकिन Name = "MyApp.Mobile.Droid.MainActivity"अपनी लक्ष्य गतिविधि के लिए पूरा नाम विशेषता सेट करना न भूलें ।


0

15/06/2019 तक

मैंने जो किया, उसमें url खोलने की सभी चार संभावनाएँ शामिल हैं।

यानी, के साथ http/ httpsऔर 2 के साथwww उपसर्ग और 2 बिनाwww

और इसके उपयोग से मेरा ऐप बिना ब्राउज़र और अन्य विकल्प चुनने के लिए स्वचालित रूप से लॉन्च होता है।

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="https" android:host="example.in" />
    <data android:scheme="https" android:host="www.example.in" />
    <data android:scheme="http" android:host="example.in" />
    <data android:scheme="http" android:host="www.example.in" />

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