Bagaimana cara mengimplementasikan skema URI saya sendiri di Android

161

Katakanlah saya ingin mendefinisikan bahwa URI seperti:

myapp://path/to/what/i/want?d=This%20is%20a%20test

harus ditangani oleh aplikasi atau layanan saya sendiri. Perhatikan bahwa skemanya adalah "myapp"dan tidak "http", atau "ftp". Itulah tepatnya yang saya maksudkan: untuk menentukan skema URI saya sendiri secara global untuk OS Android. Apakah ini mungkin?

Ini agak analog dengan apa yang sudah dilakukan beberapa program, misalnya sistem Windows, seperti Skype ( skype://) atau program pengunduh torrent apa pun ( torrent://).

poni
sumber
3
Duplikat
Casebash

Jawaban:

215

Ini sangat mungkin; Anda mendefinisikan skema URI di AndroidManifest.xml Anda, menggunakan <data>elemen. Anda menyiapkan filter maksud dengan <data>elemen yang diisi, dan Anda akan dapat membuat skema Anda sendiri. ( Lebih lanjut tentang filter maksud dan resolusi maksud di sini .)

Ini contoh singkatnya:

<activity android:name=".MyUriActivity">
    <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="myapp" android:host="path" />
    </intent-filter>
</activity>

Sesuai dengan niat tersirat yang bekerja, Anda perlu mendefinisikan setidaknya satu tindakan dan satu kategori juga; di sini saya memilih TAMPILAN sebagai aksinya (meskipun bisa berupa apa saja), dan memastikan untuk menambahkan kategori DEFAULT (karena ini diperlukan untuk semua maksud tersirat). Perhatikan juga bagaimana saya menambahkan kategori BROWSABLE - ini tidak perlu, tetapi itu akan memungkinkan URI Anda dapat dibuka dari browser (fitur yang bagus).

Dan Lew
sumber
11
Butuh beberapa saat untuk mencari tahu bahwa untuk menautkan ke jalur tertentu yang variabel "android: path" harus menentukan semuanya setelah protokol, yaitu. itu harus dalam bentuk "youtube.com/myvideo"
Casebash
2
Berfungsi bagus tetapi bagaimana saya bisa membaca nilai parameter GET "d" yang diberikan di url dari MyUriActivity?
Timo
tidak berfungsi untuk saya, saya memiliki beberapa filter Intent untuk aktivitas yang sama. Satu untuk peluncur utama. kedua untuk membuka file tertentu ketiga seperti di atas Dua yang pertama bekerja dengan sempurna tetapi tidak yang ketiga.
mohitum
dapatkah Anda melihat pertanyaan di sini stackoverflow.com/q/29116574/3828908
Salmaan
1
Versi bahasa Inggris dari tautan di atas kalau-kalau ada yang membutuhkannya.
Zensaburou
67

Melengkapi jawaban @DanielLew , untuk mendapatkan nilai parameter yang harus Anda lakukan ini:

Contoh URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

dalam aktivitas Anda:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}
Diego Palomar
sumber
bagaimana jika tautannya seperti http://www.host.com/directory/value? Bagaimana kita bisa mendapatkan ini value?
Bugs Terjadi
3
Sudahlah, dapatkan jawaban SO di sini .
Bugs Terjadi
Cara membaca tag data dalam AndroidManifest.xml dalam kode tanpa menggunakan meta data. Saya membutuhkannya untuk mengirim skema yang tepat, path & host ke server juga dalam panggilan oauth. Saya tidak ingin menduplikasi deklarasi panggil kembali!
Pradeep Chakravarti Gudipati
@BugsHappen itu segmen jalur URI terakhir. Gunakanuri.getLastPathSegment();
Martin
25

Saya sangat menyarankan agar Anda tidak mendefinisikan skema Anda sendiri. Ini bertentangan dengan standar web untuk skema URI, yang mencoba untuk secara ketat mengontrol nama-nama itu untuk alasan yang baik - untuk menghindari konflik nama antara entitas yang berbeda. Setelah Anda meletakkan tautan ke skema Anda di situs web, Anda telah memasukkan nama kecil itu ke seluruh ruang nama Internet, dan harus mengikuti standar-standar itu.

Jika Anda hanya ingin memiliki tautan ke aplikasi Anda sendiri, saya sarankan Anda mengikuti pendekatan yang saya jelaskan di sini:

Bagaimana cara mendaftarkan beberapa namespace URL (myapp: //app.start/) untuk mengakses program Anda dengan memanggil URL di browser di Android OS?

hackbod
sumber
2
Terima kasih atas perhatiannya, tetapi saya hanya akan menggunakan ini untuk mencoba membuktikan konsep, dalam lingkungan tertutup. Jika eksperimen ini pernah meninggalkan fase pengujian, saya pasti akan mempertimbangkan untuk meratifikasi seluruh kesepakatan.
punnie
5
Oke ... tapi mengapa tidak melakukan hal yang benar saja? Ini bukan pekerjaan yang signifikan.
hackbod
2
Youtube melakukan apa yang disarankan oleh @hackbod, tetapi membuka tautan Youtube dari facebook membuka peramban dan bukan aplikasi Youtube. Apakah mekanisme ini terlalu "halus"?
AlikElzin-kilaka
19
Saya condong ke arah mendefinisikan skema saya sendiri sehingga saya dapat menggunakan logika web yang sama untuk meluncurkan aplikasi iOS saya ATAU aplikasi Android saya. Hanya 2 sen saya
Chicowitz
1
@hackbod Saya tidak berpikir mereka mengingat android ketika mereka menulis rfc itu. Sementara saya 100% bersama Anda bahwa tidak perlu membuat skema baru, saya pikir alasannya persis seperti ini: bahwa bahkan tidak perlu untuk mencapai tujuan. Dan sekarang .. ketika Anda seperti facebook, whatsapp atau alat tec besar lainnya yang sudah mapan - "jangan membuat Skema URI baru" -Rule tidak berlaku untuk Anda lagi tentu saja. Tidak akan ada tabrakan pada nama skema ketika nama Anda sudah terikat pada perusahaan dalam skala global.
icyerasor
6

Pendekatan alternatif lain untuk Diego adalah menggunakan perpustakaan:

https://github.com/airbnb/DeepLinkDispatch

Anda dapat dengan mudah mendeklarasikan URI yang ingin Anda tangani dan parameter yang ingin Anda ekstrak melalui anotasi pada Kegiatan, seperti:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

Sebagai nilai tambah, parameter kueri juga akan diteruskan ke Aktivitas.

Kristen
sumber
1

Seperti pertanyaan yang diajukan tahun lalu, dan Android banyak berkembang pada skema URI ini.
Dari skema URI asli, hingga tautan dalam, dan sekarang Tautan Aplikasi Android.

Android sekarang merekomendasikan untuk menggunakan URL HTTP, bukan mendefinisikan skema URI Anda sendiri. Karena Tautan Aplikasi Android menggunakan URL HTTP yang menaut ke domain situs web yang Anda miliki, jadi tidak ada aplikasi lain yang dapat menggunakan tautan Anda. Anda dapat memeriksa perbandingan tautan dalam dan tautan Aplikasi Android dari sini

Sekarang Anda dapat dengan mudah menambahkan skema URI dengan menggunakan opsi Android Studio: Tools> App Links Assistant. Silakan merujuk detail ke dokumen Android: https://developer.android.com/studio/write/app-link-indexing.html

Weidian Huang
sumber