Можно ли использовать Uri.Builder и не иметь части "//"? - PullRequest
9 голосов
/ 16 декабря 2011

Я пытаюсь создать mailto: URI для отправки почты с помощью приложения GMail.Я хотел бы использовать класс android.net.Uri.Builder, чтобы сделать это, но получающийся uri имеет форму mailto://test@example.com, что заставляет приложение GMail думать, что получатель //test@example.com, а не просто test@example.com.

Я закончил тем, что сделал это:

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

но ясно, что это уродливый хак ...

Нет ли способа построить URI без части //?1014 *

Ответы [ 3 ]

8 голосов
/ 20 августа 2012

Здесь есть несколько проблем. Хотя возможно избавиться от части //, вы потеряете строки запроса. Основная проблема заключается в том, что Uri.Builder не позволит вам использовать запросы с непрозрачными URI (непрозрачный URI - это абсолютный URI, специфичная для схемы часть которого не начинается с символа косой черты, например mailto: URI).

Тем не менее, вы должны использовать uriBuilder.opaquePart() вместо uriBuilder.authority(), потому что последний неявно устанавливает ваш URI на иерархический , то есть не непрозрачный. Это избавит от //, но вам не хватает части запроса, и вы не можете установить ее, потому что любой вызов uriBuilder.appendQueryParameter() также подразумевает иерархический URI .

Короче говоря, для создания непрозрачного mailto: URI, который включает запросы, вам придется использовать

Uri uri = Uri.parse("mailto:receipient@mail.com?subject=title&body=text");

вместо этого. Конечно, литерал title и text должен быть Uri.encode() ed.

3 голосов
/ 21 февраля 2013

Ответ, данный 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 голосов
/ 27 апреля 2016

ответ sschuberth намного короче, чем kabuko , поэтому вот вариант, который также охватывает кодирование:

Uri uri = Uri.parse(
    String.format("mailto:%s?subject=%s",
        Uri.encode(recipient),
        Uri.encode(subject)
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...