Uygulamamı başlatmak için Android tarayıcısında bir bağlantı oluştursun mu?


229

Aşağıdaki gibi bir bağlantı yapmak mümkün mü:

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

Anton uygulamamın başlatılmasına neden oluyor?

Bunun pazar protokolü ile Android Market uygulaması için çalıştığını biliyorum, ancak diğer uygulamalarla benzer bir şey yapılabilir mi?

Android Market'i başlatacak bir bağlantı örneği:

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

Güncelleme: Eldarerathis tarafından sağlanan kabul ettiğim cevap harika çalışıyor, ancak sadece <intent-filter>etiketin alt öğelerinin sırasıyla ilgili bir sorun yaşadığımı belirtmek istiyorum . Sahip olduğum <intent-filter>sorunları önlemek için bu etiketteki yeni alt öğelerle bir tane daha yapmanızı öneriyorum . Örneğin benim AndroidManifest.xmlşöyle görünüyor:

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

Bu, uygulamayı cep telefonumda açamadığımda sorunumu çözdü.
Şubat'ta Unomono

9
Xml etiketlerinin sırasından bahsetmek için +1. Kesinlikle bir anlam ifade etmiyor ve hiçbir yerde belgelenmiyor, ancak eylem ve kategori etiketlerinin altında veri etiketi olduğunda, bunun işe yaramayacağını buldum.
Adam

Uygulamaya yeniden yönlendirmek ve uygulama yoksa doğru şekilde geri düşmek, tüm farklı Android tarayıcılarının (Chrome, Varsayılan, WebGörünümleri, Firefox, vb.) Branch.io servisi Bunu yapmak yardımcı olur ve ücretsizdir.
Alex Austin

@Anton .... merhaba efendim ... yukarıdaki kodun üstünde, ben sadece bağlantıdaki verileri işlemeyi anlıyorum ... Lütfen bana verilerimi içeren bir bağlantıyı nasıl oluşturabileceğimi söyleyebilir misiniz ... lütfen yardım Ben ... Düğme tıklama olay verileri ile bağlantı oluşturmak istiyorum ..
Ravindra Kushwaha

1
⚠️Başkalarının da farkında olmak isteyebileceği bir hata ayıklama engelini aştım: Bağlantılar web sayfalarındaki <a href=""> bağlantılarından ve adb ile başlatıldığında çalışır, ancak şimdi URL'yi mobil olarak yazdığınızda tarayıcı adres çubuğu.⚠️
Johannes Brodwall

Yanıtlar:


96

Sanırım <intent-filter>Mainfest dosyanızın elemanına bakmak isteyeceksiniz . Özellikle, <data>alt elemanın belgelerine bakın .

Temel olarak, yapmanız gereken şey kendi planınızı tanımlamaktır. Çizgileri boyunca bir şey:

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

Ardından, anton:URI şemasıyla başlayan bağlantılarla uygulamanızı başlatabilmeniz gerekir .


3
Bu konuya bir göz atmayı deneyin. Oldukça iyi bir örneği var: stackoverflow.com/questions/2958701/…
eldarerathis

3
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

3
Bu önceki android sürümlerinde mükemmel çalışıyor, ancak lolipop üzerinde değil, herhangi bir çözüm?
Mart'ta Salmaan

1
@eldareraBu uygulama yakınsa, ancak uygulama arka planda çalışıyorsa ve etkinlik bağlı filtre filtresininkinden farklıysa çalışır. Tüm aktivitelerde çalışmak için bunu nasıl yönetiyorsunuz? Hepsine niyet filtresi koyar mısın?
Mustafa Güven

5
Bu yanıt modası geçmiş ... bu, krom 40 sonrası işe yaramayacak. Güvenlik düzeni nedeniyle
kromda

280

Lütfen kendi özel şemanızı böyle KULLANMAYIN !!! URI şemaları bir ağ genel ad alanıdır. Dünya çapında "anton:" programına sahip misiniz? Hayır? O zaman KULLANMAYIN.

Bir seçenek, bir web sitesine sahip olmak ve o web sitesinde belirli bir URI için bir niyet filtresi kullanmaktır. Örneğin, Market'in URI'leri web sitesinde durdurmak için yaptığı şey budur:

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

Alternatif olarak, "niyet:" şeması vardır. Bu, neredeyse tüm Niyeti, tarayıcının tıklandığında başlatmaya çalışacağı bir URI olarak tanımlamanızı sağlar. Böyle bir şema oluşturmak için en iyi yol, başlatılmasını istediğiniz Niyeti oluşturmak için kodu yazmak ve daha sonra intent.toUri (Intent.URI_INTENT_SCHEME) sonucunu yazdırmaktır.

Bir eylemi, bu eylemi destekleyen herhangi bir etkinlik bulmak için kullanabilirsiniz. Tarayıcı, güvenlik nedenlerinden dolayı BROWSABLE kategorisini başlatmadan önce otomatik olarak amacına ekler; ayrıca, aynı nedenle sağladığınız açık bileşenleri de kaldırır.

Bunu kullanmanın en iyi yolu, yalnızca uygulamanızı başlattığından emin olmak istiyorsanız, kendi kapsamlı eyleminizle ve Niyet'in yalnızca uygulama paketinizle eşleşeceğini söylemek için Intent.setPackage () yöntemini kullanmaktır.

İkisi arasındaki ödünleşimler:

  • http URI'lar, sahip olduğunuz bir alan adınızın olmasını gerektirir. Kullanıcı her zaman URI'yi tarayıcıda gösterme seçeneğine sahip olacaktır. Uygulamanız yüklü değilse, sadece web sitenize inecekleri çok güzel geri dönüş özelliklerine sahiptir.

  • niyet URI'ları, uygulamanızın zaten yüklü olmasını ve yalnızca Android telefonlarda olmasını gerektirir. Neredeyse tüm amaçlara izin verin (ancak her zaman BROWSABLE kategorisini dahil edin ve açık bileşenleri desteklemeyin). Kullanıcı, tarayıcıya veya başka bir uygulamaya gitme seçeneğine sahip olmadan başlatmayı yalnızca uygulamanıza yönlendirmenize izin verir.


32
Öte yandan, Market uygulaması market://bağlantıları da yönetir :)
Felix

38
Pazarı kullanması bir hataydı: ve bu kaldırılıyor.
hackbod

82
İnsanların Android'de özel şemalar kullanmasının nedeni, projenin çoğunun iPhone sürümüne paralel olarak (veya sonra) geliştirilmesidir ve orada çalışmasını sağlamanın tek yolu budur ...
LambergaR

12
@LambergaR ile anlaşın. Şimdi bir e-postada 3 platformda (BB, iphone, Android) bağlantı kurmanın bir yolunu bulmalıyız
Maragues

7
Web sayfanıza özel bir şema ile eklediğiniz URI'ler, uygulamanızın yüklü olmadığı hiçbir web tarayıcısında çalışmaz. Bu sana kırık gelmiyor mu?
hackbod

13

Kendimi tanıttığım için özür dilerim, ancak web bağlantılarından yerel uygulamaları başlatmak için bir jQuery eklentim var https://github.com/eusonlito/jquery.applink

Kolayca kullanabilirsiniz:

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

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

12

Ayrıca bu sorunla karşılaştım ve birçok saçma sayfa gördüm. Uygulamanızı göz atılabilir hale getirmek, XML öğelerinin sırasını değiştirmek için bunu öğrendim:

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

Bu benim için çalıştı ve size yardımcı olabilir.


Aynı sırayla XML etiketi yazıyorum, ancak url'imi android tarayıcıya yazdığımda seçici iletişim kutusunu açamıyorum.
Sunit Kumar Gupta

çok fazla fark görmedim ve bunu kullanırsam mükemmel çalışıyor .. Teşekkür ederim :)
Muthu S

6

İşte benim tarifim:

İstediğiniz uygulama URL'sine yönlendiren statik bir HTML oluşturun, bu sayfayı web'e yerleştirin.

Bu şekilde, paylaştığınız bağlantılar Android açısından 'gerçek' bağlantılardır ('tıklanabilir').

Normal bir HTTP bağlantısını 'paylaşırsınız', www.your.server.com/foo/bar.html Bu URL, uygulamanızın URI'sına (window.location = "blah: // kuku") yönlendiren 8 satırlık basit bir HTML döndürür ( "blah" ın artık HTTP veya HTTPS olması gerekmediğini unutmayın).

Bunu çalıştırıp çalıştırdığınızda, HTML'yi yukarıda önerildiği gibi tüm fantezi özelliklerle artırabilirsiniz.

Bu, yerleşik tarayıcı, Opera ve Firefox ile çalışır (başka bir tarayıcıyı test etmemiştir). Firefox 'Bu bağlantının bir uygulama ile açılması gerekiyor' diye soruyor (tamam, iptal). Görünüşe göre diğer tarayıcılar güvenlik konusunda o kadar endişelenmiyorlar, sadece uygulamayı açıyorlar, soru sorulmadı.


Harika! Benim için çalıştı. Bu yüzden uygulamama yönlendiren özel şemaya bir bağlantı içeren html sayfası ekledik. Bağlantım<a href="iamnearby://register_activate">Activate</a>
S.Koshelnyk

4

Uygulama kurulumunuz için niyet ve özel URL şemasına sahip olduktan sonra, bir alıcı sayfanın üstündeki bu javascript kodu hem iOS hem de Android'de benim için çalıştı:

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

Bu yalnızca Android tarayıcısında test edilmiştir. Firefox veya Opera'dan emin değilim. Anahtar, Android tarayıcısı sizin için hoş bir istisna atmamasına window.open(custom_url, '_blank')rağmen, başarısız olacak ve nulldaha sonra test edebileceğiniz geri dönecektir .

Güncelleme: store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";Android'de Google Play'e bağlanmak için kullanılır .


1
loadDateTime / timeOutDateTime'in anlamı nedir? Bu bir şekilde pop-up engelleyicileri falan ele alıyor mu?
Matt Wolfe

bu benim testlerimde işe yaramıyor gibi, şema ele alınmasa bile window.open (...) her zaman yeni bir pencere açacaktır.
jtomson

@MattWolfe geç cevap verdiğim için üzgünüm. İPhone'da (Safari) bir istisna oluşmaz. Zaman aşımı, sayfa uygulamaya yönlendirildikten sonra kalan eski pencereyi kapatmak için vardır. Safari'den geçmeden bir URL'yi açmanın bir yolunu bulamadım ve bunun gibi URL'leri tanıyan diğer uygulamaların çoğu aynı şeyi yapıyor. Bu, Facebook'tan "derin bağlantı" nın avantajlarından biriydi: o eski artık pencerenin mobil Safari'den geçmesini sağlayamazsınız.
Pete

@jtomson: İlginç. Emulator ve Android 2.1'den 3'e kadar çeşitli cihazlarda test ettim (o sırada). Hangi cihaz ve Android sürümünü test ediyordunuz?
Pete

4

Uygulamanızla ilgili derin bağlantıyı işlemek için bir kütüphane düşünebilirsiniz:

https://github.com/airbnb/DeepLinkDispatch

Amaç filtresini, yukarıda önerilen kişiler gibi ek açıklamalı bir Etkinliğe ekleyebilirsiniz. Tüm derin bağlantılarınız için parametrelerin yönlendirilmesini ve ayrıştırılmasını sağlar. Örneğin, MainActivity'niz aşağıdaki gibi bir şeye sahip olabilir:

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

Ayrıca sorgu parametrelerini de işleyebilir.


1

Basit numaramı dene:

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

ve html bağlantım:

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

ya da yapabilir <a href = "classRegister: true "> <- sınıf dosya için "doğru" değeri

Ancak bu komut dosyası mailto bağlantısı için çalışır :)

        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);
        }

Bu temelde JavascriptInterfacegeçici çözüm içeren bir çağrıdır , JavascriptInterface'in hata aldığı 2.3'ü desteklemeniz gerekiyorsa, bu doğru çözümdür.
13:15

1

Bu yöntem, uygulamanızı veya tarayıcınızı açmanızı isteyen netleştirme iletişim kutusunu çağırmaz.

Aşağıdakileri Manifestinize kaydederseniz

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

örneğin telefonunuzdaki bir e-postadaki bu URL'yi tıklayın.

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

Daha sonra android paketi ile bir uygulama bulmak için çalışacağız com.myApp sizin ye yanıt verir o galeride niyet ve sahip myApp şeması. Yapamaması durumunda, uygulamanız olması gereken com.myApp'ı arayarak sizi mağazaya götürecektir .


Android etkinliğine nasıl gidilir?
Mohsen Emami
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.