2011-12-16 8 views
7

Estoy tratando de construir un uri mailto: para enviar un correo usando la aplicación GMail. Me gustaría usar la clase android.net.Uri.Builder para hacer esto, pero el uri resultante tiene el formato mailto://[email protected], lo que hace que la aplicación GMail piense que el destinatario es //[email protected], en lugar de solo [email protected].¿Es posible usar Uri.Builder y no tener la parte "//"?

que terminé haciendo esto:

String uriStr = uriBuilder.toString(); 
uriStr = uriStr.replaceAll("//", ""); 
final Uri uri = Uri.parse(uriStr); 

pero claramente, esto es un truco feo ...

¿No hay manera de construir la URI sin la parte //?

+0

Mostrar cómo se construyó el URI – Blundell

+0

Aquí es @Blundell: última Constructor UriBuilder = new Constructor(); uriBuilder.scheme ("mailto"); uriBuilder.authority (destinatario); uriBuilder.appendQueryParameter ("subject", subject); uriBuilder.appendQueryParameter ("cuerpo", cuerpo); Cadena uriStr = uriBuilder.toString(); – BoD

Respuesta

6

Hay varios problemas aquí. Si bien es posible deshacerse de la parte //, entonces perderá las cadenas de consulta. El principal problema es que Uri.Builder no le permitirá utilizar consultas con URI opacos (un URI opaco es un URI absoluto cuya parte específica del esquema no comienza con un carácter de barra, como mailto: URI).

Dicho esto, debe usar uriBuilder.opaquePart() en lugar de uriBuilder.authority() porque este último implicitly sets your URI to hierarchical, es decir, no opaco. Esto eliminará el //, pero le falta la parte de consulta y no puede establecerlo, ya que cualquier llamada al uriBuilder.appendQueryParameter() también implies a hierarchical URI.

En resúmen, para construir una opaca mailto: URI que incluye consultas, que tendrá que utilizar

Uri uri = Uri.parse("mailto:[email protected]?subject=title&body=text"); 

lugar.

2

La respuesta dada por sschuberth es una buena explicación de lo que está pasando, sino como una respuesta más práctica (que hacer quieren escapar correctamente los parámetros, etc., después de todo), que utiliza dos constructores de evitar esto:

Builder builder1 = new Builder(); 
builder1.scheme("mailto"); 
builder1.opaquePart(emailAddress); 

Builder builder2 = new Builder(); 
builder2.appendQueryParameter("subject", subject); 
builder2.appendQueryParameter("body", body); 

Uri uri = Uri.parse(builder1.toString() + builder2.toString()); 

es probable que no quieren hacer esto en un bucle estrecho con millones de direcciones, pero para el uso general, creo que este debe estar bien.

+0

Siempre prefiero contacto siempre que haya dos cadenas 'builder1.toString(). Concat (builder2.toString())' –

0

sschuberth's answer es mucho más breve que kabuko's, así que aquí tiene una variante que también cubre la codificación:

Uri uri = Uri.parse(
    String.format("mailto:%s?subject=%s", 
     Uri.encode(recipient), 
     Uri.encode(subject) 
    ) 
); 
Cuestiones relacionadas