Creare un collegamento nel browser Android per avviare la mia app?


229

È possibile creare un collegamento come:

<a href="anton://useful_info_for_anton_app">click me!</a>

far avviare la mia app Anton?

So che funziona con l'app Android Market con il protocollo di mercato, ma si può fare qualcosa di simile con altre app?

Ecco un esempio di un link che avvierà Android Market:

<a href="market://search?q=pname:com.nytimes.android">click me!</a>

Aggiornamento: la risposta che ho accettato fornito da eldarerathis funziona benissimo, ma voglio solo ricordare che ho avuto qualche problema con l'ordine dei sottoelementi del <intent-filter>tag. Ti suggerisco di crearne semplicemente un altro <intent-filter>con i nuovi sottoelementi in quel tag per evitare i problemi che ho avuto. Ad esempio il mio AndroidManifest.xmlassomiglia a questo:

<activity android:name=".AntonWorld"
          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>
        <data android:scheme="anton" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Ciò ha risolto il mio problema quando non riesco ad aprire l'applicazione sul mio cellulare.
Unomono,

9
+1 per menzionare l'ordinamento dei tag xml. Non ha assolutamente senso e non è documentato da nessuna parte, ma ho scoperto che quando avessi il tag di dati sotto i tag di azione e categoria, semplicemente non avrebbe funzionato.
Adam,

Reindirizzare all'app e ricadere correttamente se l'app non è presente può essere anche un po 'un incubo, date le complessità di tutti i diversi browser Android (Chrome, Default, Webview, Firefox, ecc.). Il servizio branch.io aiuta a fare questo ed è gratuito.
Alex Austin,

@Anton .... ciao signore ... con il vostro codice sopra, capisco solo di gestire i dati dal link ... Potete per favore dirmi come posso creare un link che contenga i miei dati ... per favore aiutatemi io ... voglio creare il collegamento con i dati sull'evento clic sul pulsante ..
Ravindra Kushwaha,

1
⚠️ Ho attraversato un ostacolo di debug di cui anche altri potrebbero voler essere a conoscenza: i collegamenti funzionano da <a href=""> collegamenti in pagine Web e quando vengono avviati con adb, ma ora quando si digita semplicemente l'URL nel dispositivo mobile barra degli indirizzi del browser.⚠️
Johannes Brodwall,

Risposte:


96

Penso che vorrai guardare l' <intent-filter>elemento del tuo file Mainfest. In particolare, dai un'occhiata alla documentazione per l' <data>elemento secondario.

Fondamentalmente, ciò che dovrai fare è definire il tuo schema. Qualcosa sulla falsariga di:

<intent-filter>
    <data android:scheme="anton" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
    ...
</intent-filter>

Quindi dovresti essere in grado di avviare la tua app con collegamenti che iniziano con lo anton:schema URI.


3
Prova a dare un'occhiata a questa discussione. Ha un esempio abbastanza buona: stackoverflow.com/questions/2958701/...
eldarerathis

3
Per riferimento, l'aggiunta di CATEGORY_BROWSABLE significa che "l'attività di destinazione può essere invocata in modo sicuro dal browser per visualizzare i dati a cui fa riferimento un collegamento, ad esempio un'immagine o un messaggio di posta elettronica".
greg7gkb,

3
Funziona perfettamente con le versioni precedenti di Android, ma non con Lollipop, qualche soluzione?
Salmaan,

1
@eldarerathis funziona se l'applicazione è vicina ma se l'applicazione è in esecuzione in background e l'attività è diversa da quella a cui è collegato il filtro di intenti, non sono riuscito a gestirlo. Come gestisci questo per cui lavorare in tutte le attività? Metti il ​​filtro intento in tutti loro?
Mustafa Güven,

5
Questa risposta non è aggiornata..questo non funzionerà dopo Chrome 40. Lo schema personalizzato è stato disabilitato in Chrome a causa di problemi di sicurezza
Utsav Gupta,

280

Per favore NON usare il tuo schema personalizzato come quello !!! Gli schemi URI sono uno spazio dei nomi globale della rete . Possiedi lo schema "anton:" in tutto il mondo? No? Quindi NON usarlo.

Un'opzione è quella di avere un sito Web e un filtro di intenti per un URI specifico su quel sito Web. Ad esempio, questo è ciò che fa Market per intercettare gli URI sul suo sito Web:

        <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="http" android:host="market.android.com"
                android:path="/search" />
        </intent-filter>

In alternativa, esiste lo schema "intent:". Ciò ti consente di descrivere quasi tutti gli Intenti come URI, che il browser proverà ad avviare facendo clic. Per creare un tale schema, il modo migliore è semplicemente scrivere il codice per costruire l'intento che si desidera avviare e quindi stampare il risultato di intent.toUri (Intent.URI_INTENT_SCHEME).

È possibile utilizzare un'azione con questo intento per trovare qualsiasi attività a supporto di tale azione. Il browser aggiungerà automaticamente la categoria BROWSABLE all'intento prima di avviarlo, per motivi di sicurezza; eliminerà inoltre qualsiasi componente esplicito fornito per lo stesso motivo.

Il modo migliore per utilizzarlo, se vuoi assicurarti che avvii solo la tua app, è con la tua azione con ambito e usando Intent.setPackage () per dire che l'intento corrisponderà solo al pacchetto dell'app.

Svantaggi tra i due:

  • Gli URI http richiedono che tu possieda un dominio di tua proprietà. L'utente avrà sempre la possibilità di mostrare l'URI nel browser. Ha proprietà di fallback molto belle in cui se l'app non è installata, atterrerà semplicemente sul tuo sito web.

  • gli URI intenti richiedono che l'app sia già installata e solo sui telefoni Android. Consentono quasi ogni intento (ma hanno sempre inclusa la categoria BROWSABLE e non supportano componenti espliciti). Ti consentono di indirizzare il lancio solo verso la tua app senza che l'utente abbia la possibilità di accedere al browser o a qualsiasi altra app.


32
D'altra parte, l'app Market gestisce anche i market://collegamenti :)
Felix

38
È stato un errore usare market :, e questo è stato rimosso.
hackbod,

82
Il motivo per cui le persone usano schemi personalizzati in Android è perché la maggior parte dei progetti sono sviluppati in parallelo con (o dopo) la versione per iPhone, e questo è l'unico modo per farlo funzionare lì ...
LambergaR

12
d'accordo con @LambergaR. Ora dobbiamo trovare un modo per far funzionare un collegamento in un'e-mail su 3 piattaforme (BB, iPhone, Android)
Maragues,

7
Qualsiasi URI inserito nella tua pagina Web con uno schema personalizzato non funzionerà su alcun browser Web in cui non è installata anche l'applicazione. Non ti sembra rotto?
hackbod,

13

Mi scuso per avermi promosso, ma ho un plug-in jQuery per avviare app native da collegamenti Web https://github.com/eusonlito/jquery.applink

Puoi usarlo facilmente:

<script>
$('a[data-applink]').applink();
</script>

<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>

12

Ho anche affrontato questo problema e ho visto molte pagine assurde. Ho imparato che per rendere la tua app sfogliabile, cambia l'ordine degli elementi XML, questo questo:

<activity
    android:name="com.example.MianActivityName"
    android:label="@string/title_activity_launcher">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>                
        <data android:scheme="http" />     
        <!-- or you can use deep linking like  -->               

        <data android:scheme="http" android:host="xyz.abc.com"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>
</activity>

Questo ha funzionato per me e potrebbe aiutarti.


Scrivo tag XML nella stessa sequenza ma non riesco ad aprire la finestra di dialogo di selezione quando scrivo il mio URL nel browser Android.
Sunit Kumar Gupta,

non ho visto molta differenza, e se uso questo funziona perfettamente .. Grazie :)
Muthu S

6

Ecco la mia ricetta:

Crea un HTML statico che reindirizzi all'URL dell'app richiesta, metti quella pagina sul Web.

In questo modo, i collegamenti che condividi sono collegamenti "reali" per quanto riguarda Android (saranno "cliccabili").

"Condividi" un normale link HTTP, www.your.server.com/foo/bar.html Questo URL restituisce un semplice codice HTML a 8 righe che reindirizza all'URI della tua app (window.location = "blah: // kuku") ( nota che "blah" non deve più essere HTTP o HTTPS).

Una volta installato e funzionante, puoi aumentare l'HTML con tutte le fantasiose funzionalità come suggerito sopra.

Funziona con il browser integrato, Opera e Firefox (non ho testato nessun altro browser). Firefox chiede "Questo link deve essere aperto con un'applicazione" (ok, annulla). A quanto pare, altri browser non si preoccupano così tanto della sicurezza, aprono semplicemente l'app, senza fare domande.


Grande! Ha funzionato per me. Quindi abbiamo aggiunto la pagina HTML con un collegamento allo schema personalizzato che reindirizza alla mia app. Il mio link è<a href="iamnearby://register_activate">Activate</a>
S. Koshelnyk,

4

Dopo aver impostato l'intento e lo schema URL personalizzato per la configurazione dell'app, questo codice javascript nella parte superiore di una pagina di ricezione ha funzionato per me su iOS e Android:

<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
    navigator.userAgent.match(/android/i)) {
  var store_loc = "itms://itunes.com/apps/raditaz";
  var href = "/iphone/";
  var is_android = false;
  if (navigator.userAgent.match(/android/i)) {
    store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
    href = "/android/";
    is_android = true;
  }
  if (location.hash) {
    var app_loc = "raditaz://" + location.hash.substring(2);
    if (is_android) {
      var w = null;
      try {
        w = window.open(app_loc, '_blank');
      } catch (e) {
        // no exception
      }
      if (w) { window.close(); }
      else { window.location = store_loc; }
    } else {
      var loadDateTime = new Date();
      window.setTimeout(function() {
        var timeOutDateTime = new Date();
        if (timeOutDateTime - loadDateTime < 5000) {
          window.location = store_loc;
        } else { window.close(); }
      },
      25);
      window.location = app_loc;
    }
  } else {
    location.href = href;
  }
}
</script>

Questo è stato testato solo sul browser Android. Non sono sicuro di Firefox o Opera. La chiave è anche se il browser Android non farà una bella eccezione window.open(custom_url, '_blank'), fallirà e tornerà, nullche puoi testare in seguito.

Aggiornamento: utilizzo store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";per il collegamento a Google Play su Android.


1
qual è il punto di loadDateTime / timeOutDateTime? Questo in qualche modo aggira i blocchi dei popup o qualcosa del genere?
Matt Wolfe,

questo non sembra funzionare nei miei test, window.open (...) aprirà sempre una nuova finestra, anche se lo schema non viene gestito.
Jtomson,

@MattWolfe scusa per la risposta tardiva. Su iPhone (Safari) non viene generata alcuna eccezione. Il timeout è lì per chiudere la finestra non aggiornata in Safari che rimane dopo il reindirizzamento della pagina all'app. Non ho trovato il modo di aprire un URL senza passare per Safari e la maggior parte delle altre app che riconoscono URL come questo fanno la stessa cosa. Questo è stato uno dei vantaggi del "deep linking" da Facebook: non si ottiene quella finestra rimanente stantia che passa attraverso Safari mobile.
Pete,

@jtomson: interessante. Ho testato sull'emulatore e vari dispositivi da Android 2.1 a 3 (al momento). Su quale dispositivo e versione Android stavi testando?
Pete,

4

Puoi prendere in considerazione una libreria per gestire il deep link alla tua app:

https://github.com/airbnb/DeepLinkDispatch

Puoi aggiungere il filtro intenti su un'attività annotata come le persone suggerite sopra. Gestirà il routing e l'analisi dei parametri per tutti i tuoi deep link. Ad esempio, MainActivity potrebbe avere qualcosa del genere:

@DeepLink("somePath/{useful_info_for_anton_app}")
public class MainActivity extends Activity {
   ...
}

Può anche gestire parametri di query.


1

Prova il mio semplice trucco:

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("classRegister:")) {                  
                Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
            }               
            view.loadUrl(url);
            return true;
        }

e il mio link html:

<a href="classRegister:true">Go to register.java</a>

o si può fare <a href = "classRegister: true "> <- "vero" valore per la classe filename

tuttavia questo script funziona per mailto link :)

        if (url.startsWith("mailto:")) {
            String[] blah_email = url.split(":");
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
            Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
            startActivity(emailIntent);
        }

Questa è essenzialmente una chiamata a a JavascriptInterfacecon la soluzione alternativa, questa è la soluzione alternativa giusta se è necessario supportare 2.3 in cui JavaScriptInterface è intercettato.
EpicPandaForce,

1

Questo metodo non richiama la finestra di dialogo di chiarimento delle richieste che ti chiede di aprire la tua app o un browser.

Se si registra quanto segue nel proprio manifest

<manifest package="com.myApp" .. >
  <application ...>
    <activity ...>
      <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="gallery"
          android:scheme="myApp" />
      </intent-filter>
    </activity>
    ..

e fai clic su questo URL da un'e-mail sul telefono, ad esempio

<a href="intent://gallery?directLink=true#Intent;scheme=myApp;package=com.myApp;end"> 
  Click me 
</a>

quindi Android proverà a trovare un'app con il pacchetto com.myApp che risponda alle intenzioni della tua galleria e abbia uno schema myApp . In caso contrario, ti porterà allo store, alla ricerca di com.myApp , che dovrebbe essere la tua app.


Come andare a un'attività Android?
Mohsen Emami il
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.