2010-08-25 13 views
7

Sé que esto ya se ha pedido muchas veces en StackOverflow, pero aún no he encontrado una solución. Mi aplicación envía un correo electrónico con un enlace que, cuando se pulsa, debe iniciar la aplicación.Lanzamiento de mi aplicación usando el URI intencionado

De acuerdo con @hackbod, la mejor manera de hacerlo es hacer uso del URI intencionado (ver this). Aquí está mi código que establece la intención y lo pone en el cuerpo del correo electrónico:

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(); 
} 

Esto es lo que recibo de 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>. 

Cuando veo el correo electrónico de mi teléfono mediante la aplicación de Gmail, Puedo hacer clic en el enlace de Google y se inicia el navegador, no hay problema con eso.

Pero el enlace para la intención ni siquiera se puede hacer clic (Mientras que desde el borrador parece se debe hacer clic en). ¿Alguien ha intentado esto y lo ha hecho funcionar?

From draft: link looks clickableSent email: link not clickable

editar # 1: También he intentado fijar la acción a Intent.ACTION_VIEW pero el enlace todavía no se puede hacer clic.

EDIT # 2: Aparentemente, el enlace realmente es clicable. ¡Intenté usar otro cliente de correo electrónico y se puede hacer clic en los enlaces! Parece que hay un error en GMail. Oh bien. Pero aparentemente, esto es más difícil de lo que pensaba. He intentado utilizar:

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

Como sugiere @CommonsWare, he intentado comprobar si existen receptores de este customIntent. Aparentemente hay uno, que es lo que esperaba. El próximo paso es convertir este intento en un URI que pueda usar en el correo electrónico. Solía:

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

el cual, basado en mi comprensión de la documentación, me diera algo así como los enlaces http habituales, sólo con el esquema que figura a intent. Entonces puedo usar este customUri como el valor de los enlaces en el correo electrónico. PERO, parece que este no es el caso. ¿Alguien tiene un ejemplo de lo que debe devolver .toUri?

+0

Esto se está volviendo largo, pero creo que he encontrado el problema. Esta es la intención que deseo que genere el enlace: 'Intención {act = com.test.project.action.CUSTOM_ACTION dat = com.test.project: //my.authority}'.En cambio, obtengo este Intento cuando hago clic en el enlace del correo electrónico: 'Intención {act = android.intent.action.VIEW dat = intención: //mi.autoridad#Intenta; esquema = com.prueba.proyecto; acción = com.test.project.action.CUSTOM_ACTION; end (tiene extras)} '. Basado en la documentación de Intent.parseUri (String uri, int flags), el cliente de correo electrónico está interpretando mi URI como * NOT * generado por toUri(). ¿Mi suposición es correcta? – Zarah

+0

¿fue capaz de hacer que esto funcione y cuál fue la solución? ¡Gracias! – hopia

+0

@hopia No lo he intentado de nuevo en mucho tiempo. Puede ver los comentarios entre mí y CommonsWare a continuación para ver mis hallazgos durante la investigación. También puede probar la respuesta más nueva a continuación (aún no la he probado). :) – Zarah

Respuesta

4

Puede probar las cotizaciones de sus URL en sus elementos <a>, ya que así es como se supone que debe escribirse HTML.

También puede tratar de confirmar, a través de parseUri(), PackageManager, y queryIntentActivities(), si la URL generada resuelve a algo - si no es así, entonces hay un problema con la URL.

Here is a sample project mostrando el uso de URI_INTENT_SCHEME, en caso de que le brinde alguna idea.

+0

(whooops, algo malo con el formateo de allí). Verificará su enlace para el manejador de URL, ¡gracias! Pero creo que enfrentaré ese obstáculo una vez que obtenga el enlace para hacer clic. También intentará validar la URL, se lo haremos saber. :) ¡Gracias como siempre! :) – Zarah

+0

@Zarah: Mi punto es que el enlace no se puede hacer clic si Android no puede encontrar nada para manejar el clic. – CommonsWare

3

Utilice la bandera cero para crear URI con su esquema personalizado. Intent.URI_INTENT_SCHEME indicador de banderas de "intento": esquema (y sintaxis loca de URI de intención general) para ser utilizado.

String customUri = customIntent.toUri(0); 
Cuestiones relacionadas