Come implementare il mio schema URI su Android


161

Di 'che voglio definire che un URI come:

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

deve essere gestito dalla mia applicazione o servizio. Si noti che lo schema è "myapp"e non "http", o "ftp". Questo è esattamente ciò che intendo: definire il mio schema URI a livello globale per il sistema operativo Android. È possibile?

Questo è in qualche modo analogo a quello che alcuni programmi già fanno su, ad esempio, i sistemi Windows, come Skype ( skype://) o qualsiasi programma torrent downloader ( torrent://).


Risposte:


215

Questo è molto possibile; tu definisci lo schema URI in AndroidManifest.xml, usando l' <data>elemento Si imposta un filtro intento con l' <data>elemento compilato e si sarà in grado di creare il proprio schema. ( Maggiori informazioni sui filtri di intenti e sulla risoluzione degli intenti qui .)

Ecco un breve esempio:

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

In base a come funzionano gli intenti impliciti, è necessario definire almeno un'azione e una categoria; qui ho scelto VIEW come azione (anche se potrebbe essere qualsiasi cosa) e mi sono assicurato di aggiungere la categoria DEFAULT (in quanto ciò è necessario per tutti gli scopi impliciti). Nota anche come ho aggiunto la categoria BROWSABLE - questo non è necessario, ma consentirà ai tuoi URI di essere aperti dal browser (una funzionalità intelligente).


11
Mi ci è voluto un po 'per capire che per collegarsi a un percorso specifico che la variabile "android: path" deve specificare tutto dopo il protocollo, vale a dire. deve essere nel formato "youtube.com/myvideo"
Casebash,

2
Funziona alla grande ma come posso leggere il valore del parametro GET "d" indicato nell'URL da MyUriActivity?
Timo,

non funziona per me, ho più filtri Intent per la stessa attività. Uno per il lanciatore principale. secondo per aprire un determinato file terzo come sopra I primi due funzionano perfettamente ma non il terzo.
Mohitum,

puoi per favore guardare la domanda qui stackoverflow.com/q/29116574/3828908
Salmaan

1
Versione in lingua inglese del link sopra nel caso in cui qualcuno ne abbia bisogno.
Zensaburou,

68

Completando la risposta @DanielLew , per ottenere i valori dei parametri devi fare questo:

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

nella tua attività:

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

cosa succede se il collegamento è simile http://www.host.com/directory/value? Come possiamo ottenere questo value?
Bugs Happen

3
Non importa, ho ottenuto la risposta SO qui .
Bugs Happen

Come leggere i tag di dati in AndroidManifest.xml nel codice senza utilizzare i metadati. Ho bisogno di questo per inviare lo schema, il percorso e l'host esatti al server anche nella chiamata oauth. Non voglio duplicare la dichiarazione di richiamata!
Pradeep Chakravarti Gudipati,

@BugsHappen è l'ultimo segmento del percorso URI. Usauri.getLastPathSegment();
Martin il

25

Consiglio vivamente di non definire il proprio schema. Questo va contro gli standard web per gli schemi URI, che tentano di controllare rigidamente quei nomi per una buona ragione - per evitare conflitti di nomi tra entità diverse. Una volta inserito un collegamento al tuo schema su un sito Web, hai inserito quel piccolo nome nell'intero spazio dei nomi di Internet e dovresti seguire questi standard.

Se vuoi solo essere in grado di avere un link alla tua app, ti consiglio di seguire l'approccio che ho descritto qui:

Come registrare alcuni spazi dei nomi URL (myapp: //app.start/) per accedere al programma chiamando un URL nel browser nel sistema operativo Android?


2
Grazie per il testa a testa, ma lo userò solo per provare a dimostrare un concetto, in un ambiente chiuso. Se questo esperimento dovesse mai abbandonare la sua fase di test, prenderò sicuramente in considerazione la ratifica dell'intero accordo.
punnie

5
Va bene ... ma perché non fare solo la cosa giusta? Non è più significativo il lavoro.
hackbod

2
Youtube fa ciò che suggerisce @hackbod, ma aprendo i collegamenti Youtube da Facebook si apre il browser e non l'app Youtube. Questo meccanismo è troppo "delicato"?
AlikElzin-Kilaka

19
Mi sto orientando verso la definizione del mio schema in modo da poter utilizzare la stessa logica Web per avviare la mia app iOS o la mia app Android. Solo i miei 2 centesimi
Chicowitz,

1
@hackbod Non penso che avessero in mente Android quando hanno scritto quell'RFC. Mentre sono al 100% con te che non è necessario creare un nuovo schema, penso che il motivo sia esattamente questo: che non è nemmeno necessario per raggiungere l'obiettivo. E ora .. quando sei come Facebook, WhatsApp o altri strumenti tecnologici affermati, la regola "non creare un nuovo schema URI" non si applica più a te, ovviamente. Non ci sarà alcuna collisione sui nomi degli schemi quando il tuo nome è già legato a un'azienda su scala globale.
Icyerasor,

6

Un altro approccio alternativo a quello di Diego è l'uso di una libreria:

https://github.com/airbnb/DeepLinkDispatch

Puoi facilmente dichiarare gli URI che desideri gestire e i parametri che desideri estrarre attraverso le annotazioni sull'attività, come:

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

Inoltre, anche i parametri della query verranno passati all'attività.


1

Poiché la domanda viene posta anni fa e Android si è evoluto molto su questo schema URI.
Dallo schema URI originale, al deep link e ora ai link delle app Android.

Android ora consiglia di utilizzare URL HTTP, non di definire il proprio schema URI. Poiché i link delle app Android utilizzano URL HTTP che rimandano a un dominio di un sito Web di tua proprietà, pertanto nessun'altra app può utilizzare i tuoi link. Puoi controllare il confronto tra deep link e link delle app Android da qui

Ora puoi aggiungere facilmente uno schema URI usando l'opzione Android Studio: Strumenti> App Link Assistant. Si prega di fare riferimento al documento Android: https://developer.android.com/studio/write/app-link-indexing.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.