Buat tautan di peramban Android jalankan aplikasi saya?

229

Apakah mungkin membuat tautan seperti:

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

menyebabkan aplikasi Anton saya mulai?

Saya tahu ini berfungsi untuk aplikasi Android Market dengan protokol pasar, tetapi bisakah hal serupa dilakukan dengan aplikasi lain?

Berikut adalah contoh tautan yang akan memulai Android Market:

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

Pembaruan: Jawaban yang saya terima dari eldarerathis sangat bagus, tetapi saya hanya ingin menyebutkan bahwa saya mengalami masalah dengan urutan subelemen dari <intent-filter>tag. Saya sarankan Anda membuat yang lain <intent-filter>dengan subelemen baru di tag itu untuk menghindari masalah yang saya miliki. Misalnya AndroidManifest.xmlpenampilan saya seperti ini:

<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>
Anton
sumber
Ini menyelesaikan masalah saya ketika saya tidak bisa membuka aplikasi di ponsel saya.
Unomono
9
+1 untuk menyebutkan urutan tag xml. Itu sama sekali tidak masuk akal dan tidak didokumentasikan di mana pun, tetapi saya menemukan bahwa ketika saya memiliki tag data di bawah tag tindakan dan kategori, itu sama sekali tidak berfungsi.
Adam
Mengarahkan kembali ke aplikasi dan mundur dengan benar jika aplikasi tidak ada dapat menjadi sedikit mimpi buruk juga, mengingat kompleksitas semua browser Android yang berbeda (Chrome, Default, Tampilan Web, Firefox, dll). Layanan branch.io membantu melakukan ini dan gratis.
Alex Austin
@Anton .... halo pak ... dengan kode Anda di atas, saya hanya mengerti untuk menangani data dari tautan ... Bisakah Anda memberi tahu saya bagaimana cara membuat tautan yang berisi data saya ... tolong bantu saya ... Saya ingin membuat tautan dengan data pada acara klik tombol ..
Ravindra Kushwaha
1
⚠️ Saya menemukan rintangan debugging yang mungkin juga perlu diperhatikan oleh orang lain: Tautan tersebut berfungsi dari <a href=""> tautan di laman web dan saat diluncurkan dengan adb, tetapi sekarang saat Anda cukup mengetik URL di ponsel bilah alamat browser.⚠️
Johannes Brodwall

Jawaban:

96

Saya pikir Anda akan ingin melihat <intent-filter>elemen file Mainfest Anda. Secara khusus, lihat dokumentasi untuk <data>sub-elemen.

Pada dasarnya, yang perlu Anda lakukan adalah mendefinisikan skema Anda sendiri. Sesuatu di sepanjang garis:

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

Maka Anda harus dapat meluncurkan aplikasi Anda dengan tautan yang dimulai dengan anton:skema URI.

eldarerathis
sumber
3
Coba lihat utas ini. Ini memiliki contoh yang cukup bagus: stackoverflow.com/questions/2958701/…
eldarerathis
3
Sebagai referensi, menambahkan CATEGORY_BROWSABLE berarti bahwa "Aktivitas target dapat dipanggil dengan aman oleh browser untuk menampilkan data yang dirujuk oleh tautan - misalnya, gambar atau pesan email."
greg7gkb
3
Ini berfungsi dengan baik pada versi android sebelumnya, tetapi tidak pada lollipop, ada solusi?
Salmaan
1
@eldarerathis ini berfungsi jika aplikasi dekat tetapi jika aplikasi berjalan di latar belakang dan aktivitasnya berbeda dari yang maksud filter terpasang saya tidak bisa mengatasinya. Bagaimana Anda mengelola ini untuk bekerja di semua kegiatan? Apakah Anda memasukkan filter niat ke semuanya?
Mustafa Güven
5
Jawaban ini sudah usang ... ini tidak akan berfungsi setelah chrome 40. Skema kustom telah dinonaktifkan di chrome karena masalah keamanan
Utsav Gupta
280

JANGAN gunakan skema khusus Anda sendiri seperti itu !!! Skema URI adalah jaringan global namespace . Apakah Anda memiliki skema "anton:" di seluruh dunia? Tidak? Maka JANGAN menggunakannya.

Salah satu opsi adalah memiliki situs web, dan memiliki filter maksud untuk URI tertentu di situs web itu. Misalnya, inilah yang dilakukan Market untuk mencegat URI di situs webnya:

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

Atau, ada skema "niat:". Ini memungkinkan Anda untuk mendeskripsikan hampir semua Intent sebagai URI, yang akan coba diluncurkan oleh browser ketika diklik. Untuk membangun skema seperti itu, cara terbaik adalah menulis kode untuk membangun Intent yang ingin Anda luncurkan, dan kemudian mencetak hasil dari intent.toUri (Intent.URI_INTENT_SCHEME).

Anda dapat menggunakan tindakan dengan maksud ini untuk menemukan aktivitas apa pun yang mendukung tindakan itu. Browser akan secara otomatis menambahkan kategori BROWSABLE ke maksud sebelum meluncurkannya, untuk alasan keamanan; itu juga akan menghapus komponen eksplisit yang Anda berikan untuk alasan yang sama.

Cara terbaik untuk menggunakan ini, jika Anda ingin memastikan hanya meluncurkan aplikasi Anda, adalah dengan tindakan Anda sendiri dan menggunakan Intent.setPackage () untuk mengatakan bahwa Intent hanya akan cocok dengan paket aplikasi Anda.

Pertukaran antara keduanya:

  • http URI mengharuskan Anda memiliki domain yang Anda miliki. Pengguna akan selalu mendapatkan opsi untuk menampilkan URI di browser. Ini memiliki sifat back-back yang sangat bagus di mana jika aplikasi Anda tidak diinstal, mereka hanya akan mendarat di situs web Anda.

  • URI niat mengharuskan aplikasi Anda sudah diinstal dan hanya di ponsel Android. Izinkan hampir semua maksud (tetapi selalu menyertakan kategori BROWSABLE dan tidak mendukung komponen eksplisit). Mereka memungkinkan Anda untuk mengarahkan peluncuran hanya ke aplikasi Anda tanpa pengguna memiliki pilihan untuk pergi ke browser atau aplikasi lain.

hackbod
sumber
32
Di sisi lain, aplikasi Market juga menangani market://tautan :)
Felix
38
Itu kesalahan untuk menggunakan pasar :, dan ini sedang dihapus.
hackbod
82
Alasan mengapa orang menggunakan skema khusus di Android adalah karena sebagian besar proyek dikembangkan secara paralel dengan (atau setelah) versi iPhone, dan ini adalah satu-satunya cara untuk membuatnya bekerja di sana ...
LambergaR
12
setuju dengan @LambergaR. Sekarang kita perlu mencari cara untuk membuat tautan dalam sebuah karya email dalam 3 platform (BB, iphone, Android)
Maragues
7
URI apa pun yang Anda masukkan ke halaman web dengan skema khusus tidak akan berfungsi pada browser web apa pun yang tidak memiliki aplikasi Anda yang terinstal. Bukankah itu kelihatannya rusak bagimu?
hackbod
13

Saya minta maaf karena mempromosikan diri saya sendiri, tetapi saya memiliki plugin jQuery untuk meluncurkan aplikasi asli dari tautan web https://github.com/eusonlito/jquery.applink

Anda dapat menggunakannya dengan mudah:

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

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

Saya juga menghadapi masalah ini dan melihat banyak halaman tidak masuk akal. Saya telah belajar bahwa untuk membuat aplikasi Anda dapat dijelajahi, ubah urutan elemen XML, ini ini:

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

Ini bekerja untuk saya dan mungkin membantu Anda.

ashwani
sumber
Saya menulis tag XML dalam urutan yang sama tetapi tidak dapat membuka dialog pemilih ketika saya menulis url saya di browser android.
Sunit Kumar Gupta
saya tidak melihat banyak perbedaan, dan jika saya menggunakan yang ini berfungsi dengan baik .. Terima kasih :)
Muthu S
6

Ini resep saya:

Buat HTML statis yang mengarahkan ke URL aplikasi yang Anda minta, letakkan halaman itu di web.

Dengan begitu, tautan yang Anda bagikan adalah tautan 'asli' sejauh menyangkut Android (tautan itu akan 'dapat diklik').

Anda 'membagikan' tautan HTTP reguler, www.your.server.com/foo/bar.html URL ini mengembalikan HTML 8 baris sederhana yang dialihkan ke URI aplikasi Anda (window.location = "blah: // kuku") ( perhatikan bahwa 'bla' tidak harus berupa HTTP atau HTTPS lagi).

Setelah Anda menjalankan dan menjalankannya, Anda dapat menambah HTML dengan semua kemampuan mewah seperti yang disarankan di atas.

Ini berfungsi dengan browser bawaan, Opera, dan Firefox (belum menguji browser lain). Firefox bertanya 'Tautan ini perlu dibuka dengan aplikasi' (ok, batalkan). Peramban lain tampaknya tidak terlalu mengkhawatirkan keamanan, mereka hanya membuka aplikasi, tidak ada pertanyaan.

JRun
sumber
Bagus! Ini berhasil untuk saya. Jadi kami menambahkan halaman html dengan tautan ke skema khusus yang mengalihkan ke aplikasi saya. Tautan saya<a href="iamnearby://register_activate">Activate</a>
S. Koshelnyk
4

Setelah Anda memiliki maksud dan skema url khusus untuk pengaturan aplikasi Anda, kode javascript ini di bagian atas halaman penerima telah berfungsi untuk saya di iOS dan 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>

Ini hanya diuji pada browser Android. Saya tidak yakin tentang Firefox atau Opera. Kuncinya adalah meskipun peramban Android tidak akan memberikan pengecualian yang bagus untuk Anda window.open(custom_url, '_blank'), peramban itu akan gagal dan kembali nullyang dapat Anda uji nanti.

Pembaruan: gunakan store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";untuk menautkan ke Google Play di Android.

Pete
sumber
1
apa gunanya loadDateTime / timeOutDateTime? Apakah ini entah bagaimana mengatasi pemblokir popup atau sesuatu?
Matt Wolfe
ini sepertinya tidak berfungsi dalam pengujian saya, window.open (...) akan selalu membuka jendela baru, bahkan jika skema tidak ditangani.
jtomson
@MattWolfe maaf atas jawaban yang terlambat. Di iPhone (Safari) tidak terkecuali dilemparkan. Waktu tunggu habis untuk menutup jendela basi di Safari yang tersisa setelah halaman dialihkan ke aplikasi. Saya belum menemukan cara untuk membuka url tanpa harus melalui Safari dan sebagian besar aplikasi lain yang mengenali url seperti ini melakukan hal yang sama. Itulah salah satu keuntungan dari "deep linking" dari Facebook: Anda tidak mendapatkan jendela sisa basi melalui Safari seluler.
Pete
@ jtomson: Menarik. Saya menguji pada Emulator dan berbagai perangkat dari Android 2.1 hingga 3 (pada saat itu). Perangkat dan versi Android apa yang Anda uji?
Pete
4

Anda mungkin ingin mempertimbangkan perpustakaan untuk menangani tautan dalam ke aplikasi Anda:

https://github.com/airbnb/DeepLinkDispatch

Anda dapat menambahkan filter maksud pada Aktivitas beranotasi seperti yang disarankan orang di atas. Ini akan menangani perutean dan penguraian parameter untuk semua tautan dalam Anda. Misalnya, MainActivity Anda mungkin memiliki sesuatu seperti ini:

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

Itu juga dapat menangani parameter kueri.

Kristen
sumber
1

Coba trik sederhana saya:

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

dan tautan html saya:

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

atau Anda dapat membuat <a href = "classRegister: benar "> <- nilai "true" untuk kelas nama file

namun skrip ini berfungsi untuk tautan 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);
        }
IRvanFauziE
sumber
Ini pada dasarnya adalah panggilan untuk JavascriptInterfacedengan solusi, ini solusi yang tepat jika Anda perlu mendukung 2.3 di mana JavascriptInterface disadap.
EpicPandaForce
1

Metode ini tidak memanggil dialog disambiguasi yang meminta Anda untuk membuka aplikasi atau browser Anda.

Jika Anda mendaftarkan yang berikut di Manifest Anda

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

dan klik url ini dari email di ponsel Anda misalnya

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

maka android akan mencoba mencari aplikasi dengan paket com.myApp yang merespons maksud galeri Anda dan memiliki skema myApp . Jika tidak bisa, itu akan membawa Anda ke toko, mencari com.myApp , yang seharusnya menjadi aplikasi Anda.

kucing laut
sumber
Bagaimana cara pergi ke aktivitas android?
Mohsen Emami