2011-12-16 33 views
7

Tôi đang cố gắng tạo một uri mailto: để gửi thư bằng ứng dụng Gmail. Tôi muốn sử dụng lớp android.net.Uri.Builder để làm điều này, nhưng uri kết quả ở dạng mailto://[email protected], làm cho ứng dụng GMail cho rằng người nhận là //[email protected], thay vì chỉ [email protected].Có thể sử dụng Uri.Builder và không có phần "//" không?

tôi đã kết thúc làm điều này:

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

nhưng rõ ràng, đây là một hack xấu xí ...

Có không có cách nào để xây dựng uri mà không có phần //?

+0

Hiện cách bạn xây dựng URI – Blundell

+0

Dưới đây là @Blundell: thức Builder uriBuilder = new Builder(); uriBuilder.scheme ("mailto"); uriBuilder.authority (người nhận); uriBuilder.appendQueryParameter ("chủ đề", chủ đề); uriBuilder.appendQueryParameter ("body", body); Chuỗi uriStr = uriBuilder.toString(); – BoD

Trả lời

6

Có một số vấn đề ở đây. Mặc dù có thể loại bỏ phần //, bạn sẽ mất các chuỗi truy vấn sau đó. Vấn đề chính là Uri.Builder sẽ không cho phép bạn sử dụng truy vấn với URI mờ (URI mờ là URI tuyệt đối mà phần cụ thể của lược đồ không bắt đầu bằng ký tự gạch chéo, chẳng hạn như mailto: URI).

Điều đó nói rằng, bạn nên sử dụng uriBuilder.opaquePart() thay vì uriBuilder.authority() vì sau implicitly sets your URI to hierarchical, tức là không mờ đục. Điều này sẽ loại bỏ các //, nhưng bạn đang thiếu phần truy vấn sau đó, và bạn không thể thiết lập nó, bởi vì bất kỳ cuộc gọi đến uriBuilder.appendQueryParameter() cũng implies a hierarchical URI.

dài truyện ngắn, để xây dựng một đục mailto: URI trong đó bao gồm các truy vấn, bạn sẽ phải sử dụng

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

để thay thế.

2

Câu trả lời được đưa ra bởi sschuberth là giải thích tốt về những gì đang xảy ra, nhưng là một câu trả lời thực tế hơn (bạn do muốn thoát đúng các thông số, v.v.), tôi đã sử dụng hai nhà xây dựng để giải quyết vấn đề này:

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

Có thể bạn không muốn làm điều này trong một vòng lặp chặt chẽ với hàng triệu địa chỉ, nhưng để sử dụng chung, tôi nghĩ điều này sẽ ổn.

+0

Tôi luôn thích liên hệ bất cứ khi nào có hai chuỗi 'builder1.toString(). Concat (builder2.toString())' –

0

sschuberth's answer nhiều briefer hơn kabuko's, vì vậy đây là một biến thể đó cũng bao gồm mã hóa:

Uri uri = Uri.parse(
    String.format("mailto:%s?subject=%s", 
     Uri.encode(recipient), 
     Uri.encode(subject) 
    ) 
); 
Các vấn đề liên quan