Jak zaimplementować mój własny schemat URI na Androida

161

Powiedzmy, że chcę zdefiniować identyfikator URI, taki jak:

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

muszą być obsługiwane przez moją własną aplikację lub usługę. Zauważ, że schemat jest "myapp"i nie "http", lub "ftp". To jest dokładnie to, co zamierzam: zdefiniować własny schemat URI globalnie dla systemu operacyjnego Android. czy to możliwe?

Jest to trochę analogiczne do tego, co niektóre programy już robią w systemach Windows, takich jak Skype ( skype://) lub dowolny program do pobierania torrentów ( torrent://).

punnie
źródło
3
Duplikat
Casebash

Odpowiedzi:

215

To jest bardzo możliwe; definiujesz schemat identyfikatora URI w pliku AndroidManifest.xml, używając <data>elementu. Skonfigurujesz filtr intencji z <data>wypełnionym elementem i będziesz mógł stworzyć własny schemat. ( Więcej na temat filtrów intencji i rozwiązywania intencji tutaj ).

Oto krótki przykład:

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

Jeśli chodzi o sposób działania ukrytych zamiarów, musisz zdefiniować co najmniej jedno działanie i jedną kategorię; tutaj wybrałem VIEW jako akcję (choć może to być cokolwiek) i upewniłem się, że dodałem kategorię DEFAULT (ponieważ jest to wymagane dla wszystkich niejawnych intencji). Zwróć też uwagę, jak dodałem kategorię DO PRZEGLĄDANIA - nie jest to konieczne, ale pozwoli na otwieranie twoich identyfikatorów URI z przeglądarki (sprytna funkcja).

Dan Lew
źródło
11
Zajęło mi trochę czasu, zanim zrozumiałem, że aby połączyć się z określoną ścieżką, zmienna „android: path” musi określać wszystko po protokole, tj. musi mieć format „youtube.com/myvideo”
Casebash
2
Działa świetnie, ale jak mogę odczytać wartość parametru GET „d” podanego w adresie URL z MyUriActivity?
Timo,
nie działa dla mnie Mam wiele filtrów intencji dla tego samego działania. Jeden dla głównego programu uruchamiającego. drugi do otwierania konkretnego pliku trzeci jak wyżej Pierwsze dwa działają idealnie, ale trzeci nie.
Mohitum
czy możesz spojrzeć na pytanie tutaj stackoverflow.com/q/29116574/3828908
Salmaan
1
Angielska wersja powyższego linku na wypadek, gdyby ktoś tego potrzebował.
Zensaburou
68

Uzupełniając odpowiedź @DanielLew , aby uzyskać wartości parametrów należy zrobić tak:

Przykład identyfikatora URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

w Twojej działalności:

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
źródło
co jeśli link jest podobny http://www.host.com/directory/value? Jak możemy to osiągnąć value?
Błędy wydarzyły się
3
Nieważne, dostałem odpowiedź SO tutaj .
Błędy wydarzyły się
Jak czytać tagi danych w AndroidManifest.xml w kodzie bez używania metadanych. Potrzebuję tego, aby wysłać dokładny schemat, ścieżkę i hosta do serwera również w wywołaniu oauth. Nie chcę powielać deklaracji oddzwonienia!
Pradeep Chakravarti Gudipati
@BugsHappen to ostatni segment ścieżki URI. Wykorzystanieuri.getLastPathSegment();
Martin
25

Zdecydowanie odradzam definiowanie własnego schematu. Jest to sprzeczne ze standardami sieciowymi dotyczącymi schematów URI, które próbują sztywno kontrolować te nazwy z dobrego powodu - aby uniknąć konfliktów nazw między różnymi podmiotami. Kiedy umieścisz łącze do swojego schematu na stronie internetowej, umieścisz tę małą nazwę w całej przestrzeni nazw w Internecie i powinieneś przestrzegać tych standardów.

Jeśli chcesz mieć tylko link do własnej aplikacji, radzę postępować zgodnie z podejściem, które opisałem tutaj:

Jak zarejestrować przestrzeń nazw URL (myapp: //app.start/) w celu uzyskania dostępu do programu przez wywołanie adresu URL w przeglądarce w systemie Android?

hackbod
źródło
2
Dziękuję za ostrzeżenia, ale użyję tego tylko do udowodnienia koncepcji w zamkniętym środowisku. Jeśli ten eksperyment kiedykolwiek opuści fazę testową, zdecydowanie rozważę ratyfikację całej umowy.
punnie
5
Dobra ... ale dlaczego nie zrobić po prostu właściwej rzeczy? To nie jest żadna znacząca praca.
hackbod
2
Youtube robi to, co sugeruje @hackbod, ale otwarcie linków do Youtube z Facebooka otwiera przeglądarkę, a nie aplikację Youtube. Czy ten mechanizm jest zbyt „delikatny”?
AlikElzin-kilaka
19
Skłaniam się do zdefiniowania własnego schematu, aby móc używać tej samej logiki internetowej do uruchamiania aplikacji na iOS LUB aplikacji na Androida. Tylko moje 2 centy
Chicowitz,
1
@hackbod Nie sądzę, żeby mieli na myśli androida, kiedy pisali ten rfc. Chociaż jestem w 100% z Tobą, że nie jest konieczne tworzenie nowego schematu, myślę, że przyczyna jest dokładnie taka: że nie jest to nawet konieczne, aby osiągnąć cel. A teraz… kiedy jesteś jak Facebook, WhatsApp lub inne duże, uznane narzędzia techniczne - zasada „nie twórz nowego schematu URI” - oczywiście nie ma już do Ciebie zastosowania. Nie będzie kolizji nazw schematów, jeśli Twoja nazwa jest już związana z firmą w skali globalnej.
icyerasor
6

Innym alternatywnym podejściem do Diego jest użycie biblioteki:

https://github.com/airbnb/DeepLinkDispatch

Możesz łatwo zadeklarować identyfikatory URI, które chcesz obsługiwać, i parametry, które chcesz wyodrębnić, za pomocą adnotacji w działaniu, na przykład:

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

Dodatkowo parametry zapytania zostaną również przekazane do działania.

chrześcijanin
źródło
1

Ponieważ pytanie zadawano lata temu, a Android bardzo rozwinął się w tym schemacie URI.
Od oryginalnego schematu URI po precyzyjne linki, a teraz linki do aplikacji na Androida.

Android zaleca teraz używanie adresów URL HTTP, a nie definiowanie własnego schematu URI. Ponieważ linki do aplikacji na Androida używają adresów URL HTTP prowadzących do domeny witryny, której jesteś właścicielem, żadna inna aplikacja nie może ich używać. Porównanie precyzyjnych linków i linków do aplikacji na Androida możesz sprawdzić tutaj

Teraz możesz łatwo dodać schemat URI, korzystając z opcji Android Studio: Narzędzia> Asystent łączy aplikacji. Proszę zapoznać się ze szczegółami w dokumencie dotyczącym Androida: https://developer.android.com/studio/write/app-link-indexing.html

Weidian Huang
źródło