2010-08-25 14 views
7

So che questo è già stato richiesto più volte in StackOverflow, ma non ho ancora trovato una soluzione. La mia app invia un'email con un link al suo interno che, una volta cliccata, dovrebbe lanciare l'app.Avvio della mia app utilizzando l'URI di intento

Secondo @hackbod, il modo migliore per farlo è utilizzare l'URI Intent (vedere this). Ecco il mio codice che imposta l'intento e lo mette nel corpo dell'e-mail:

Intent customIntent = new Intent(CUSTOM_ACTION); 
customIntent.setPackage(MY_PACKAGE); 
customIntent.addCategory(MY_CAT_BROWSABLE); 
customIntent.addCategory(MY_CAT_DEFAULT); 

String customUri = customIntent.toUri(Intent.URI_INTENT_SCHEME); 

String emailBody = getString(R.string.intent_link, customUri); 

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("text/html"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "Recommending vid"); 
intent.putExtra(Intent.EXTRA_TEXT , Html.fromHtml(emailBody)); 
try { 
    startActivity(Intent.createChooser(intent, "Choose email client:")); 
} catch (android.content.ActivityNotFoundException ex) { 
    Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
} 

Questo è quello che ricevo da LogCat:

08-25 17:01:23.333: VERBOSE/Test URI(16987): intent:#Intent;action=com.test.project.action.VIEW_VID_FROM_LINK;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;package=com.test.project;end 
08-25 17:01:23.338: VERBOSE/Test email text(16987): Hi,<br><br>Testing intents from an email.<br><br> A standard website: <a href=http://www.google.com>Go to Google</a>.<br><br> This link should launch the app: <a href=intent:#Intent;action=com.test.project.action.VIEW_VID_FROM_LINK;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;package=com.test.project;end>Click link to launch</a>. 

Quando osservo l'e-mail dal mio telefono utilizzando l'applicazione GMail, Posso fare clic sul link di Google e avvia il browser, nessun problema con quello.

Ma il collegamento per l'intento non è nemmeno cliccabile (mentre dal progetto sembra che sia dovrebbe essere cliccabile). Qualcuno ha provato e ha funzionato?

From draft: link looks clickableSent email: link not clickable

EDIT # 1: Ho anche provato impostando l'azione Intent.ACTION_VIEW ma il link non è ancora cliccabile.

MODIFICA n. 2: Apparentemente, il collegamento in realtà è selezionabile. Ho provato a utilizzare un altro client di posta elettronica e i collegamenti sono selezionabili! Sembra che ci sia un bug in GMail. Oh bene. Ma a quanto pare, questo è più difficile di quanto pensassi. Ho provato ad utilizzare:

Uri.Builder builder = new Uri.Builder(); 
builder.scheme("my.own.scheme"); 
builder.authority("my.authority"); 
Uri newUri = builder.build(); 
Intent customIntent = new Intent(CUSTOM_ACTION, newUri); 

Come suggerito da @CommonsWare, ho provato a controllare se ci sono ricevitori di questo customIntent. Apparentemente ce n'è uno, che è quello che mi aspettavo. Quindi il prossimo passo è rendere questo intento in un URI che posso usare nell'e-mail. Ho usato:

String customUri = customIntent.toUri(Intent.URI_INTENT_SCHEME); 

che, basato sulla mia comprensione della documentazione, dovrebbe darmi qualcosa come i soliti link http, solo con lo schema impostato intent. Posso quindi utilizzare questo customUri come valore per i collegamenti nell'e-mail. MA, sembra che questo non sia il caso. Qualcuno ha un esempio di cosa deve restituire .toUri?

+0

Questo sta diventando lungo, ma penso di aver trovato il problema. Questo è l'intento che voglio che il collegamento spawn: 'Intent {act = com.test.project.action.CUSTOM_ACTION dat = com.test.project: //my.authority}'.Invece, sto ottenendo questo intento quando clicco sul link nell'email: 'Intent {act = android.intent.action.VIEW dat = intent: //my.authority#Intent; scheme = com.test.project; action = com.test.project.action.CUSTOM_ACTION; end (ha extra)} '. Basato sulla documentazione Intent.parseUri (String uri, int flags), il client di posta elettronica interpreta il mio URI come * NOT * generato da toUri(). La mia ipotesi è corretta? – Zarah

+0

sei riuscito a far funzionare questo e qual era la soluzione? Grazie! – hopia

+0

@hopia Non ci ho provato più a lungo. Puoi guardare i commenti tra me e CommonsWare qui sotto per esaminare i miei risultati durante le indagini. Puoi anche provare la nuova risposta qui sotto (non l'hai ancora provata). :) – Zarah

risposta

4

È possibile provare le virgolette sugli URL negli elementi <a>, poiché è così che si suppone che venga scritto l'HTML.

Si potrebbe anche provare conferma, tramite parseUri(), PackageManager e queryIntentActivities(), se l'URL generato decide di qualcosa - se non lo fa, allora c'è un problema con l'URL.

Here is a sample project che mostra l'uso di URI_INTENT_SCHEME, nel caso in cui vi dà qualche idea.

+0

(whooops, qualcosa non va con la formattazione lassù). Verificherà il tuo link per il gestore di URL, grazie! Ma penso che affronterò quell'ostacolo una volta ottenuto il link per essere cliccabile. Proverai anche a convalidare l'URL, ti faremo sapere. :) Grazie come sempre! :) – Zarah

+0

@Zarah: il mio punto è che il collegamento potrebbe non essere selezionabile se Android non riesce a trovare nulla per gestire il clic. – CommonsWare

3

Utilizzare lo zero flag per creare l'URI con lo schema personalizzato. Intent.URI_INTENT_SCHEME forze bandiera "intent:" schema (e sintassi pazzo URI intento generale) da utilizzare.

String customUri = customIntent.toUri(0); 
Problemi correlati