2011-12-16 7 views
7

Próbuję zbudować mailto: uri, aby wysłać wiadomość e-mail przy użyciu aplikacji GMail. Chciałbym użyć klasy android.net.Uri.Builder, aby to zrobić, ale wynikowe polecenie uri ma postać mailto://[email protected], dzięki czemu aplikacja GMail uważa, że ​​odbiorca to //[email protected], a nie tylko [email protected].Czy można używać Uri.Builder i nie mieć części "//"?

skończyło się w ten sposób:

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

jednak wyraźnie, że jest to brzydki siekać ...

Czy nie ma sposobu, aby zbudować uri bez // części?

+0

pokazać jak jesteś zbudowany URI – Blundell

+0

Tu jest @Blundell: końcowy Builder uriBuilder = new Builder(); uriBuilder.scheme ("mailto"); uriBuilder.authority (odbiorca); uriBuilder.appendQueryParameter ("subject", subject); uriBuilder.appendQueryParameter ("body", body); String uriStr = uriBuilder.toString(); – BoD

Odpowiedz

6

Istnieje kilka problemów tutaj. Chociaż można pozbyć się części //, stracisz wtedy ciągi zapytań. Głównym problemem jest to, że Uri.Builder nie pozwoli ci używać zapytań z nieprzezroczystymi identyfikatorami URI (nieprzejrzysty URI jest bezwzględnym identyfikatorem URI, którego część specyficzna dla schematu nie zaczyna się od znaku ukośnego, takiego jak URI).

Powiedziawszy, powinieneś użyć uriBuilder.opaquePart() zamiast uriBuilder.authority(), ponieważ ten ostatni implicitly sets your URI to hierarchical, tj. Nie jest nieprzezroczysty. Spowoduje to pozbycie się //, ale brakuje Ci części zapytania, a nie możesz jej ustawić, ponieważ każde połączenie z numerem uriBuilder.appendQueryParameter() również implies a hierarchical URI.

Krótko mówiąc, aby skonstruować nieprzezroczystą mailto: URI, który zawiera pytania, będziesz musiał użyć

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

zamiast.

2

Odpowiedź udzielona przez sschuberth jest dobrym wyjaśnieniem tego, co się dzieje, ale jako bardziej praktyczną odpowiedź (w końcu chcesz właściwie uciec parametrom, itp.), Użyłem dwóch budujących, aby ominąć to:

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

Prawdopodobnie nie chcesz tego robić w ciasnej pętli z milionami adresów, ale do ogólnego użytku Myślę, że powinno być dobrze.

+0

Zawsze preferuję kontakt, gdy istnieją dwa ciągi 'builder1.toString(). Concat (builder2.toString())' –

0

sschuberth's answer jest znacznie krótsza niż kabuko's, więc o to wariant, który obejmuje również kodowania:

Uri uri = Uri.parse(
    String.format("mailto:%s?subject=%s", 
     Uri.encode(recipient), 
     Uri.encode(subject) 
    ) 
); 
Powiązane problemy