2011-12-16 24 views
7

我正嘗試構建mailto: uri使用GMail應用程序發送郵件。 我想使用android.net.Uri.Builder類來做到這一點,但由此產生的uri格式爲mailto://[email protected],這使得GMail應用程序認爲收件人是//[email protected],而不僅僅是[email protected]是否有可能使用Uri.Builder而沒有「//」部分?

我落得這樣做:

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

但很顯然,這是一個醜陋的黑客...

有沒有辦法建立無//部分的URI?

+0

告訴你如何建立的URI – Blundell 2011-12-16 17:14:55

+0

這@Blundell: 最終生成器uriBuilder =新生成器(); uriBuilder.scheme(「mailto」); uriBuilder.authority(recipient); uriBuilder.appendQueryParameter(「subject」,subject); uriBuilder.appendQueryParameter(「body」,body); String uriStr = uriBuilder.toString(); – BoD 2012-01-13 10:38:31

回答

6

這裏有幾個問題。雖然有可能擺脫//部分,但您將丟失查詢字符串。主要問題是Uri.Builder不會讓你使用帶有不透明URI的查詢(一個不透明的URI是一個絕對URI,其特定於方案的部分不以斜槓字符開頭,如mailto: URI)。

也就是說,您應該使用uriBuilder.opaquePart()而不是uriBuilder.authority(),因爲後者implicitly sets your URI to hierarchical即非透明。這將擺脫//,但你缺乏查詢部分,然後你不能設置它,因爲任何呼叫uriBuilder.appendQueryParameter()implies a hierarchical URI

長話短說,構建不透明mailto: URI,包括查詢,你將不得不使用

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

代替。

2

由sschuberth給出的答案是一個很好的解釋發生了什麼,但作爲一個更實際的答案(你想要妥善轉義參數等),我用兩個建設者來解決這個問題:

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

你可能不希望在數百萬個地址的緊密循環中這樣做,但對於一般用途,我認爲這應該沒問題。

0

sschuberth's answerkabuko's更簡潔,所以這裏也包括編碼變異:

Uri uri = Uri.parse(
    String.format("mailto:%s?subject=%s", 
     Uri.encode(recipient), 
     Uri.encode(subject) 
    ) 
); 
相關問題