Android tarayıcıdan özel android uygulamasını başlat


Yanıtlar:


616

<intent-filter>Bir <data>eleman içeren bir kullanın . Örneğin, twitter.com için tüm bağlantıları işlemek için aşağıdaki konularda içinde bu koyardım <activity>Gözlerinde farklı AndroidManifest.xml:

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

Daha sonra, kullanıcı tarayıcıda twitter bağlantısını tıkladığında, eylemi tamamlamak için hangi uygulamanın kullanılacağı sorulur: tarayıcı veya uygulamanız.

Tabii ki, web siteniz ve uygulamanız arasında sıkı bir entegrasyon sağlamak istiyorsanız, kendi düzeninizi tanımlayabilirsiniz:

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

Ardından, web uygulamanızda aşağıdaki gibi bağlantılar koyabilirsiniz:

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

Kullanıcı tıkladığında, uygulamanız otomatik olarak başlatılır (çünkü muhtemelen my.special.scheme://uris türünü işleyebilecek tek kişi olacaktır ). Bunun tek dezavantajı, kullanıcının uygulamayı yüklememesi durumunda kötü bir hata alacaklarıdır. Ve kontrol etmenin bir yolu olduğundan emin değilim.


Düzenleme: Sorunuzu yanıtlamak için, getIntent().getData()bir Urinesneyi döndüren öğeyi kullanabilirsiniz . Daha sonra Uri.*ihtiyacınız olan verileri ayıklamak için yöntemler kullanabilirsiniz . Örneğin, kullanıcının aşağıdakiler için bir bağlantıyı tıkladığını varsayalım 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"

Yukarıdakileri herhangi bir yerde yapabilirsiniz Activity, ancak muhtemelen bunu yapmak isteyeceksiniz onCreate(). params.size()İçindeki yol segmentlerinin sayısını almak için de kullanabilirsiniz Uri. UriBelirli parçaları çıkarmak için kullanabileceğiniz diğer yöntemler için javadoc veya android geliştirici web sitesine bakın .


6
Hemen cevap için bir ton teşekkürler. Ama lütfen "my.special.scheme: //" ifadesinden sonra parametrelere nasıl erişileceğini söyleyebilir misiniz?
Parimal Modi

4
Cevabımı Uri'den veri çıkarma hakkındaki talimatları içerecek şekilde düzenledim. Yanındaki onay işaretini tıklayarak, lütfen bu yanıtı kabul edildi (yalnızca) olarak işaretleyin.
Felix

9
hedeflenen android uygulaması yüklü değilse ne olur? Bununla nasıl başa çıkılır.
Nemo

13
Benim gibi, bu şema işini alamadı, herkes eklemek gerekir android:exported="true"geçen ay ActivityManifestte. Bu yanıtı kontrol edin stackoverflow.com/a/13044911/1276636
Sufian

4
Bunun tüm dünya için nasıl çalıştığından emin değilim. Sadece krom üzerinde çalışmaz ve siz "android: pathPrefix" öğesini yerleştirinceye kadar bağlantıyı her zaman tarayıcıda açar. Cevap yine de dokümantasyonda belirtildiği gibi kategori değerlerine sahip değildir. Hala biri için işe yaramıyorsa, lütfen şuna bakın: stackoverflow.com/a/21727055/2695276 PS: günlerce bunun için mücadele etti.
Rajat Sharma

70

Yukarıdaki yanıtların tümü CHROME28 Ocak 2014 itibariyle benim için çalışmadı

Uygulamam , hangout'lar, gmail vb. gibi uygulamalardan gelen http://example.com/someresource/ bağlantılarından düzgün bir şekilde başlatıldı , ancak krom tarayıcıdan değil.

Bunu çözmek için, CHROME'den düzgün bir şekilde başlatılması için böyle bir filtre ayarlamanız gerekir.

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

pathPrefixunsuru not et

kullanıcı , google arama sonuçlarından veya başka bir web sitesinden bir bağlantıyı tıklatarak krom tarayıcıdan http://example.com/someresource/ desen istediğinde artık etkinlik seçicide görünecektir


Bu bana çok yardımcı oldu. Çok teşekkürler! Size ödülü verebilmemiz için lütfen cevabınızı buraya gönderin! stackoverflow.com/questions/21663001/…
Vlad Schnakovszki

Bu hangi dil?
Dims

Merhaba, çok eski olduğunu biliyorum. Ben de aynı senaryoda vuruldum. Ben pathPrefix, düzeni ve ana bilgisayar belirttik ama çalışmıyor. Sadece şema ile denedim, sonra çalıştı. Ama ev sahibi eklediğimde, çalışmayı durdurdu. Sorun ne olabilir?
seema

Bu cevaba gelene kadar günler geçirdim. PathPrefix öğesi olmadan tüm dünya için nasıl çalıştığından emin değilim. Dokümanlara göre her şeyi yapmamıza rağmen krom üzerinde hiç çalışmadım. Çok teşekkür ederim.
Rajat Sharma

66

Lütfen buradaki yorumuma bakın: Android tarayıcısında uygulamamı başlatmak için bir bağlantı oluştursun mu?

Yeni bir dünya çapında internet şeması tanımlamıyorlarsa, insanların kendi şemalarını kullanmalarını kesinlikle önermiyoruz.


10
Hackbod, Android platformunun arkasındaki Google mühendislerinden biridir. Bu tavsiyeye uymak muhtemelen iyi bir fikirdir. Aslında, Honeycomb'da böyle kırılmış özel şema desteği gibi görünüyor.
nmr

23
İOS tarafından geliştiricilere getirilen sınırlamalardan sorumlu tutulamaz. ;)
hackbod

12
sorumlu tutuldu? Hayır. Ancak,
beğenip beğenmediğinize

6
hackbod özellikle Android için bir soruyu cevaplıyor. İOS'tan bahsedilmiyor, bu yüzden dikkate almanıza gerek yok.
nilskp

4
@hackbod, farklı web sitelerinde böyle bir bağlantının bulunabileceğini varsayarak, bir şemayı (yani href = "com.alanadiniz.myapp // her neyse") iyi bir uygulama olarak adlandırır mı?
Julien Bérubé

48

Benim durumumda için iki kategori ayarlamak zorunda kaldım <intent-filter>ve sonra çalıştı:

<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
Burada aynı, ek kategori eklemek gerekiyordu.
KPK

Birisi bunu yapmanın asıl sürecinin ne olduğunu açıklayabilir mi? Kesin uygulama, önkoşullar için herhangi bir bağlantı yardımcı olacaktır. Teşekkürler
Ankit Garg

Geliştirme kurulumunda test edildi. Aslında yanlış bir alan adı veriyordum. Benim hatam.
Ankit Garg

En çok oy alan cevap benim için işe yaramadı, ama bu işe yaradı. Teşekkür ederim.
EL45

25

Örneğin, sıradaki şeyleriniz var:

Uygulamanızı açma bağlantısı: http://example.com

Uygulamanızın paket adı: com.example.mypackage

O zaman yapmanız gerekenler:

1) Faaliyetinize bir amaç filtresi ekleyin (İstediğiniz herhangi bir etkinlik olabilir. Daha fazla bilgi için belgelere bakın ).

        <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) Bağlantıyı test etmek için bir HTML dosyası oluşturun veya bu yöntemleri kullanın .

<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) Test etmek için Mobil Chrome'u kullanın

4) Hepsi bu.

Derin bağlantıyı test etmek için pazarda uygulama yayınlamak gerekli değildir =)

Ayrıca, daha fazla bilgi için belgelere ve yararlı sunuma bakın .


Html dosyası oluşturmak ve çalışmasını sağlamak için yüklemek zorunda kaldı. Özellikle ikincisinin neden doğrudan bir tarayıcıdan (krom) çalışmadığını merak ediyorum.
Makalele

18

<category android:name="android.intent.category.BROWSABLE"/>Etkinliğin bağlantıdan düzgün şekilde tanınmasını sağlamak için niyet filtresine de eklenmelidir.


4
Başvuru için, CATEGORY_BROWSABLE eklenmesi, "Hedef etkinliğin tarayıcı tarafından bir bağın referans verdiği verileri (örneğin, bir resim veya e-posta mesajı) görüntülemesi için güvenli bir şekilde çağrılabileceği anlamına gelir.
greg7gkb

Bu mevcut bir kategori mi yoksa yeni bir kategori mi öneriyorsunuz?
Anish

Var. Görünüşe göre, farklı amaç filtresi etiketlerinde ayrı bir web sitesi barındırıcınız olmalıdır veya sorunlara neden olur.
NoBugs

2
Sadece BROWSABLE değil, aynı zamanda android.intent.category.DEFAULT - bağlantı, e-posta (yalnızca tarayıcılar gibi) gibi diğer uygulamalarda başlatıldığında açılabilir
AlikElzin-kilaka


7

Bu özelliği uyguladığınızda simgenizin android başlatıcıdan kaybolup kaybolmadığını, niyet filtresini bölmeniz gerekmediğini lütfen unutmayın.

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


5

Felix'in cevabının Xamarin limanı

Buna şunu MainActivityekleyin ( docs: Android.App.IntentFilterAttribute Sınıfı ):

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

Xamarin AndroidManifest.xmlsizin için aşağıdakileri ekleyecektir :

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

Ve params almak için ( OnCreate of MainActivity'de test ettim ):

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];
        ...
    }
}

Bildiğim kadarıyla, yukarıdaki sadece MainActivity'ye değil, herhangi bir aktiviteye eklenebilir

Notlar:

  1. Kullanıcı bağlantıyı tıkladığında, Android OS uygulamanızı yeniden başlatır (varsa önceki örneği öldür ve yenisini çalıştır) , OnCreateuygulamaların etkinliğinin MainLauncher Activitytekrar tetikleneceği anlamına gelir .
  2. Bu bağlantı ile:, <a href="my.special.scheme://host/arg1/arg2">yukarıdaki son kod snippet değerleri şöyle olacaktır:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

Güncelleme: Android uygulamanızın yeni bir örneğini oluşturuyorsa, siz de eklemelisiniz android:launchMode="singleTask".


3

Felix'in derin linkleri ele alma yaklaşımı, derin linkleri ele alma konusunda tipik bir yaklaşımdır. Ayrıca derin bağlantılarınızın yönlendirilmesi ve ayrıştırılması için bu kütüphaneye göz atmanızı öneririm:

https://github.com/airbnb/DeepLinkDispatch

Etkinliğinizi belirli bir derin bağlantı URI'sına kaydetmek için ek açıklamaları kullanabilirsiniz ve yol parçalarını almak, eşleştirmek, vb. :

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

0

Hey çözümü buldum. Kategoriyi "Varsayılan" olarak ayarlamadım. Ayrıca, Amaç Verileri için Ana etkinliği kullanıyordum. Şimdi niyet verileri için farklı bir etkinlik kullanıyorum. Yardım için teşekkürler. :)


Olası görünmüyor (bunun eski bir soru olduğunu ve belki de bazı şeylerin değiştiğini bilmeme rağmen) developer.android.com/guide/components/intents-filters.html#ifs "Kategori testini geçmek amacıyla, Amaç nesnesi filtrede bir kategoriyle eşleşmelidir . Filtre ek kategorileri listeleyebilir, ancak amaçtaki hiçbir kategoriyi atlayamaz. "
Noach Magedman

0

CALLBACK_URL 'uygulamasına sözde ana bilgisayar adı eklemeniz gerekir: //' URL olarak anlamlı değildir ve ayrıştırılamaz.


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
Bu, iki görünmez iframe oluşturur: derin bağlantı ve normal bağlantı. Uygulama yüklüyse, derin bağlantı iframe uygulamasını başlatır. Değilse, normal bağlantı görüntülenir. Bazı ekstra çalışmalarda, uygulama yüklendikten sonra derin bağlantının çağrıldığı yerde ertelenmiş derin bağlantı uygulanabilir.
Dominic Cerisano

0

Bak @JRuns cevabı buraya . Fikir, özel şemanızla html oluşturmak ve bir yere yüklemek. Ardından, html dosyanızdaki özel bağlantınızı tıklarsanız uygulamanıza yönlendirileceksiniz. Bu makaleyi android için kullandım . Ancak Name = "MyApp.Mobile.Droid.MainActivity"hedef etkinliğiniz için tam ad özelliğini ayarlamayı unutmayın .


0

15/06/2019 itibarıyla

yaptığım şey, url açmak için dört olasılıkın hepsini dahil etmek.

yani, öneki http/ httpsve 2 olan wwwve olmayanwww

ve bunu kullanarak uygulamam bir tarayıcı ve başka bir seçenek seçmemi istemeden otomatik olarak başlatılır.

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.