Luncurkan aplikasi android khusus dari browser android

416

Adakah yang bisa membimbing saya tentang cara meluncurkan aplikasi android saya dari browser android?

Parimal Modi
sumber

Jawaban:

616

Gunakan a <intent-filter>dengan <data>elemen. Misalnya, untuk menangani semua tautan ke twitter.com, Anda akan memasukkannya ke <activity>dalam AndroidManifest.xml:

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

Kemudian, ketika pengguna mengklik tautan ke twitter di browser, mereka akan ditanya aplikasi apa yang akan digunakan untuk menyelesaikan tindakan: browser atau aplikasi Anda.

Tentu saja, jika Anda ingin memberikan integrasi yang erat antara situs web dan aplikasi Anda, Anda dapat menentukan skema Anda sendiri:

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

Kemudian, di aplikasi web Anda, Anda dapat menaruh tautan seperti:

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

Dan ketika pengguna mengkliknya, aplikasi Anda akan diluncurkan secara otomatis (karena itu mungkin satu-satunya yang dapat menangani my.special.scheme://jenis uris). Satu-satunya downside ke ini adalah bahwa jika pengguna tidak menginstal aplikasi, mereka akan mendapatkan kesalahan buruk. Dan saya tidak yakin ada cara untuk memeriksa.


Sunting: Untuk menjawab pertanyaan Anda, Anda dapat menggunakan getIntent().getData()yang mengembalikan Uriobjek. Anda kemudian dapat menggunakan Uri.*metode untuk mengekstrak data yang Anda butuhkan. Misalnya, katakanlah pengguna mengeklik tautan ke 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"

Anda dapat melakukan hal di atas di mana saja Activity, tetapi Anda mungkin ingin melakukannya onCreate(). Anda juga dapat menggunakan params.size()untuk mendapatkan jumlah segmen jalur di Uri. Lihatlah ke javadoc atau situs web pengembang android untuk Urimetode lain yang dapat Anda gunakan untuk mengekstrak bagian tertentu.

Felix
sumber
6
Terima kasih banyak atas balasan secepatnya. Tetapi bisakah Anda memberi tahu saya cara mengakses parameter setelah "my.special.scheme: //".
Parimal Modi
4
Saya telah mengedit jawaban saya untuk memasukkan instruksi tentang cara mengekstrak data dari Uri. Harap tandai jawaban ini sebagai diterima (hanya) jika Anda menganggapnya demikian dengan mengklik tanda centang di sebelahnya.
Felix
9
bagaimana jika aplikasi Android yang ditargetkan tidak diinstal? Cara menangani ini.
Nemo
13
Siapapun yang, seperti saya, tidak mampu untuk mendapatkan skema pekerjaan ini, perlu menambahkan android:exported="true"untuk mereka Activitydalam manifes. Periksa jawaban ini stackoverflow.com/a/13044911/1276636
Sufian
4
Tidak yakin bagaimana ini bekerja untuk seluruh dunia. Tidak berfungsi di chrome dan selalu membuka tautan di peramban sampai Anda menempatkan elemen "android: pathPrefix". Jawabannya anyways tidak memiliki nilai kategori seperti yang disebutkan dalam dokumentasi. Jika masih tidak bekerja untuk seseorang, lihat ini: stackoverflow.com/a/21727055/2695276 PS: berjuang selama berhari-hari karena hal ini.
Rajat Sharma
70

Semua jawaban di atas tidak bekerja untuk saya CHROMEpada 28 Januari 2014

Aplikasi saya diluncurkan dengan benar dari http://example.com/someresource/ tautan dari aplikasi seperti hangout, gmail dll tetapi tidak dari dalam browser chrome.

untuk mengatasi ini, sehingga diluncurkan dengan benar dari CHROME Anda harus menetapkan filter maksud seperti ini

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

perhatikan pathPrefixelemennya

aplikasi Anda sekarang akan muncul di dalam pemilih aktivitas setiap kali pengguna meminta pola http://example.com/someresource/ dari browser chrome dengan mengklik tautan dari hasil pencarian google atau situs web lain

AndroidGecko
sumber
Ini sangat membantu saya. Terima kasih banyak! Silakan kirim jawaban Anda di sini sehingga saya dapat memberi Anda hadiah! stackoverflow.com/questions/21663001/…
Vlad Schnakovszki
Bahasa apa ini?
Dims
Halo, saya tahu ini terlalu tua. Saya juga terkesan dalam skenario yang sama. Saya telah menentukan pathPrefix, skema dan host tetapi tidak berfungsi. Saya mencoba dengan skema saja, kemudian berhasil. Tetapi ketika saya menambahkan host, itu berhenti bekerja. Adakah yang tahu apa masalahnya?
seema
Habiskan berhari-hari sampai saya sampai pada jawaban ini. Tidak yakin cara kerjanya untuk seluruh dunia tanpa elemen pathPrefix. Tidak pernah bekerja untuk saya di chrome meskipun melakukan semuanya sesuai dokumentasi. Terima kasih banyak.
Rajat Sharma
66

Silakan lihat komentar saya di sini: Buat tautan di peramban Android memulai aplikasi saya?

Kami sangat menyarankan orang untuk tidak menggunakan skema mereka sendiri, kecuali mereka mendefinisikan skema internet baru di seluruh dunia.

hackbod
sumber
10
Hackbod adalah salah satu insinyur Google di belakang platform Android. Mungkin ide yang baik untuk mengikuti saran ini. Bahkan, sepertinya dukungan skema kustom seperti ini pecah di Honeycomb.
nmr
23
Saya tidak bertanggung jawab atas batasan yang dikenakan pada pengembang oleh iOS. ;)
hackbod
12
bertanggungjawab? tidak. Tetapi Anda dapat mempertimbangkannya, terlepas dari apakah Anda suka atau tidak, batasan itu dikenakan pada banyak pengembang Anda
ByteMe
6
hackbod menjawab pertanyaan khusus untuk Android. Tidak ada menyebutkan iOS, jadi tidak perlu memperhitungkannya.
nilskp
4
@hackbod akan menempatkan namespace skema (yaitu href = "com.ourdomain.myapp // apa pun") praktik yang baik, seandainya tautan seperti itu dapat ditemukan di situs web yang berbeda?
Julien Bérubé
48

Dalam kasus saya, saya harus menetapkan dua kategori untuk <intent-filter>dan kemudian berfungsi:

<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>
Zaki
sumber
2
Sama di sini, perlu menambahkan kategori tambahan.
KPK
Adakah yang bisa menjelaskan apa sebenarnya proses menyelesaikan ini? Setiap tautan ke implementasi yang tepat, prasyarat akan sangat membantu. Terima kasih
Ankit Garg
Diuji pada pengaturan dev. Sebenarnya saya memberikan nama domain yang salah. Salahku.
Ankit Garg
Jawaban teratas tidak berfungsi untuk saya, tetapi ini berhasil. Terima kasih.
EL45
25

Misalnya, Anda memiliki hal-hal berikut:

Tautan untuk membuka aplikasi Anda: http://example.com

Nama paket aplikasi Anda: com.example.mypackage

Maka yang perlu Anda lakukan selanjutnya:

1) Tambahkan filter maksud ke Aktivitas Anda (Dapat berupa aktivitas apa pun yang Anda inginkan. Untuk info lebih lanjut, lihat dokumentasi ).

        <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) Buat file HTML untuk menguji tautan atau gunakan metode ini.

<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) Gunakan Mobile Chrome untuk menguji

4) Itu dia.

Dan tidak perlu mempublikasikan aplikasi di pasar untuk menguji tautan dalam =)

Juga, untuk informasi lebih lanjut, periksa dokumentasi dan presentasi yang bermanfaat .

Denshov
sumber
Saya harus membuat file html dan mengunggahnya agar berfungsi. Saya bertanya-tanya mengapa, terutama yang kedua, tidak berfungsi langsung dari browser (chrome).
Makalele
18

Juga harus <category android:name="android.intent.category.BROWSABLE"/>ditambahkan ke filter maksud untuk membuat aktivitas dikenali dengan benar dari tautan.

georgij
sumber
4
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
Apakah ini kategori yang ada atau Anda mengusulkan yang baru?
Anish
Itu ada. Tampaknya Anda harus memiliki host situs web terpisah dalam tag filter-niat yang berbeda, atau itu menyebabkan masalah.
NoBugs
2
Tidak hanya BROWSABLE, tetapi juga android.intent.category.DEFAULT - sehingga tautan dapat dibuka ketika dimulai di aplikasi lain, seperti email (bukan hanya peramban)
AlikElzin-kilaka
7

Harap perhatikan jika ikon Anda hilang dari peluncur android ketika Anda menerapkan fitur ini, daripada Anda harus memisahkan filter maksud.

    <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>
Zoltan
sumber
5

Port Xamarin jawaban Felix

Di Anda MainActivity, tambahkan ini ( dokumen: Android.App.IntentFilterAttribute Class ):

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

Xamarin akan menambahkan yang berikut AndroidManifest.xmluntuk Anda:

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

Dan untuk mendapatkan params ( saya uji di OnCreate of MainActivity ):

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

Sejauh yang saya tahu, di atas dapat ditambahkan dalam aktivitas apa pun, tidak hanya MainActivity

Catatan:

  1. Saat pengguna mengeklik tautan, OS Android meluncurkan kembali aplikasi Anda (bunuh instance, jika ada, dan jalankan yang baru) , berarti OnCreateacara aplikasi MainLauncher Activityakan diaktifkan kembali.
  2. Dengan tautan ini :, dalam nilai potongan kode terakhir<a href="my.special.scheme://host/arg1/arg2"> di atas akan:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

Pembaruan: jika android membuat instance baru aplikasi Anda, Anda juga harus menambahkannya android:launchMode="singleTask".

Mehdi Dehghani
sumber
3

Pendekatan Felix untuk menangani tautan dalam adalah pendekatan khas untuk menangani tautan dalam. Saya juga menyarankan memeriksa perpustakaan ini untuk menangani perutean dan penguraian tautan dalam Anda:

https://github.com/airbnb/DeepLinkDispatch

Anda dapat menggunakan anotasi untuk mendaftarkan Aktivitas Anda untuk tautan dalam URI tertentu, dan itu akan mengekstrak parameter untuk Anda tanpa harus melakukan omong kosong biasa untuk mendapatkan segmen jalur, mencocokkannya, dll. Anda dapat dengan mudah membuat catatan dan aktivitas seperti ini :

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

Hei, aku punya solusinya. Saya tidak menetapkan kategori sebagai "Default". Saya juga menggunakan aktivitas Utama untuk Data maksud. Sekarang saya menggunakan aktivitas berbeda untuk data maksud. Terima kasih untuk bantuannya. :)

Parimal Modi
sumber
Kedengarannya tidak mungkin (meskipun saya menyadari bahwa ini adalah pertanyaan lama dan mungkin banyak hal telah berubah.) Dari developer.android.com/guide/components/intents-filters.html#ifs "Untuk niat lulus uji kategori, setiap kategori dalam objek Intent harus cocok dengan kategori di filter . Filter bisa daftar kategori tambahan, tetapi tidak bisa menghilangkan yang ada di maksud. "
Noach Magedman
0

Anda perlu menambahkan pseudo-hostname ke aplikasi CALLBACK_URL: // 'tidak masuk akal sebagai URL dan tidak dapat diuraikan.

Paul Lindner
sumber
0

contoh.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 
}
T.Todua
sumber
1
Ini menciptakan dua iframe yang tidak terlihat: tautan dalam dan tautan normal. Jika aplikasi diinstal, tautan dalam iframe akan meluncurkannya. Jika tidak, tautan normal ditampilkan. Dengan beberapa pekerjaan tambahan, penautan dalam yang ditangguhkan dapat diimplementasikan di mana tautan yang dalam dipanggil setelah aplikasi diinstal.
Dominic Cerisano
0

Lihat jawaban JRuns di sini . Idenya adalah membuat html dengan skema khusus Anda dan mengunggahnya ke suatu tempat. Kemudian jika Anda mengklik tautan khusus pada file html Anda, Anda akan diarahkan ke aplikasi Anda. Saya menggunakan artikel ini untuk android. Tapi jangan lupa untuk mengatur Name = "MyApp.Mobile.Droid.MainActivity"atribut nama lengkap untuk aktivitas target Anda.

S. Koshelnyk
sumber
0

Pada 15/06/2019

apa yang saya lakukan adalah memasukkan keempat kemungkinan untuk membuka url.

yaitu, dengan http/ httpsdan 2 dengan wwwawalan dan 2 tanpawww

dan dengan menggunakan ini aplikasi saya diluncurkan secara otomatis sekarang tanpa meminta saya untuk memilih browser dan opsi lainnya.

<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>
Vicky Salunkhe
sumber