Android'de kendi URI planımı nasıl uygularım


161

Diyelim ki şöyle bir URI tanımlamak istiyorum:

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

kendi başvurum veya servisim tarafından ele alınmalıdır. Şemaya dikkat edin ya da "myapp"değil "http", ya da "ftp". Kesinlikle niyetim bu: Android işletim sistemi için kendi URI şemamı global olarak tanımlamak. Mümkün mü?

Bu, bazı programların halihazırda yaptıklarına benzer, örneğin Skype ( skype://) veya herhangi bir torrent indirme programı ( torrent://) gibi Windows sistemleri .


Yanıtlar:


215

Bu çok mümkün; <data>öğeyi kullanarak AndroidManifest.xml dosyasında URI şemasını tanımlarsınız . <data>Öğe doldurulmuş olarak bir niyet filtresi oluşturursunuz ve kendi şemanızı oluşturabilirsiniz. ( Burada amaç filtreleri ve amaç çözümü hakkında daha fazla bilgi .)

Kısa bir örnek:

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

Örtük niyetlerin nasıl çalıştığına göre, en az bir eylem ve bir kategori tanımlamanız gerekir; Burada eylem olarak VIEW (herhangi bir şey olsa da) seçti ve VARSAYILAN kategori eklemek emin yaptı (tüm örtük niyetler için gerekli olduğu için). Ayrıca BROWSABLE kategorisini nasıl eklediğime dikkat edin - bu gerekli değildir, ancak URI'lerinizin tarayıcıdan açılabilir olmasına izin verir (şık bir özellik).


11
"Android: path" değişkeninin protokolden sonra her şeyi belirtmesi gereken belirli bir yola bağlanmak için biraz zaman ayırdım. "youtube.com/myvideo" biçiminde olmalıdır
Casebash

2
Harika çalışıyor, ancak MyUriActivity'den url'de verilen "d" GET parametresinin değerini nasıl okuyabilirim?
Timo

benim için çalışmıyor Aynı etkinlik için birden fazla Niyet filtrem var. Biri ana fırlatıcı için. ikincisi yukarıdaki gibi üçüncü bir dosyayı açmak için ilk ikisi mükemmel çalışıyor ancak üçüncü değil.
mohitum

lütfen buradaki soruya bakabilir misiniz stackoverflow.com/q/29116574/3828908
Salmaan

1
Birisinin ihtiyaç duyması durumunda yukarıdaki bağlantının İngilizce dil sürümü .
Zensaburou

68

@DanielLew yanıtını tamamlayarak, parametre değerlerini almak için bunu yapmanız gerekir:

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

faaliyetinizde:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}

bağlantı nasıl olursa http://www.host.com/directory/value? Bunu nasıl alabiliriz value?
Bugs Oldu

3
Boş ver, burada SO yanıtı var .
Hatalar Happen

MetaMayı kullanmadan AndroidManifest.xml kodundaki veri etiketlerini okuma. Oauth çağrısında da sunucuya tam düzen, yol ve ana bilgisayar göndermek için gerekir. Geri arama bildirimini çoğaltmak istemiyorum!
Pradeep Chakravarti Gudipati

@BugsHappen son URI yolu segmentidir. Kullanımuri.getLastPathSegment();
Martin

25

Kendi planınızı tanımlamamanızı önemle tavsiye ederim. Bu, farklı varlıklar arasında isim çatışmalarından kaçınmak için bu isimleri iyi bir nedenden dolayı sıkı bir şekilde kontrol etmeye çalışan URI şemaları için web standartlarına aykırıdır. Bir web sitesinde düzeninize bir bağlantı koyduktan sonra, bu küçük adı tüm Internet'in ad alanının tamamına koydunuz ve bu standartları izlemelisiniz.

Sadece kendi uygulamanıza bir bağlantıya sahip olmak istiyorsanız, burada tarif ettiğim yaklaşımı izlemenizi öneririz:

Android işletim sistemindeki tarayıcıda bir URL çağırarak programınıza erişmek için bazı URL ad alanlarını (myapp: //app.start/) nasıl kaydedersiniz?


2
Başınız için teşekkürler, ancak bunu sadece kapalı bir ortamda bir konsept kanıtlamak için kullanacağım. Bu deney hiç test aşamasından ayrılırsa, kesinlikle tüm anlaşmayı onaylamayı düşüneceğim.
Mart'ta

5
Tamam ... ama neden sadece doğru olanı yapmıyorsun? Daha fazla iş yok.
hackbod

2
Youtube @hackbod'un önerdiğini yapar, ancak Youtube bağlantılarını facebook'tan açmak Youtube uygulamasını değil tarayıcıyı açar. Bu mekanizma çok "hassas" mı?
AlikElzin-kilaka

19
İOS programımı VEYA Android uygulamamı başlatmak için aynı web mantığını kullanabilmem için kendi planımı tanımlamaya yöneliyorum. Sadece 2 sent
Chicowitz

1
@hackbod Rfc yazdıklarında akıllarında android vardı sanmıyorum. % 100 sizinle yeni bir şema oluşturmanın gerekli olmadığına rağmen, bunun sebebinin tam olarak bu olduğunu düşünüyorum: hedefe ulaşmak için bile gerekli değil. Ve şimdi .. facebook, whatsapp veya diğer büyük, yerleşik tec araçları gibi - "yeni bir URI-şeması oluşturma" -Kural artık sizin için geçerli değil. Adınız zaten küresel ölçekte bir şirkete bağlıysa, şema adlarında bir çarpışma olmayacaktır.
icyerasor

6

Diego'nun alternatif bir yaklaşımı bir kütüphane kullanmaktır:

https://github.com/airbnb/DeepLinkDispatch

İşlem yapmak istediğiniz URI'leri ve Etkinlik'teki ek açıklamalar aracılığıyla çıkarmak istediğiniz parametreleri kolayca bildirebilirsiniz:

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

Artı olarak, sorgu parametreleri de Aktiviteye iletilir.


1

Sorunun yıllar önce sorulduğu gibi, Android bu URI şemasında çok gelişti.
Orijinal URI şemasından derin bağlantıya ve şimdi Android Uygulama Bağlantılarına.

Android artık kendi URL'lerinizi tanımlamak yerine HTTP URL'lerini kullanmanızı önerir. Android Uygulama Bağlantıları, sahip olduğunuz bir web sitesi alanına bağlanan HTTP URL'leri kullandığından, başka hiçbir uygulama bağlantılarınızı kullanamaz. Sen derin bağlantı karşılaştırmasını kontrol edebilir ve Android Uygulama dan bağlantılar burada

Artık Android Studio seçeneğini kullanarak kolayca bir URI şeması ekleyebilirsiniz: Araçlar> Uygulama Bağlantıları Yardımcısı. Lütfen ayrıntıyı Android dokümanına bakın: https://developer.android.com/studio/write/app-link-indexing.html

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.