Запуск моего приложения с использованием URI

Я знаю, что это уже много раз задавалось в StackOverflow, но я еще не нашел решения. Мое приложение отправляет электронное письмо со ссылкой в ​​нем, что при щелчке следует запустить приложение.

Согласно @hackbod, лучший способ сделать это - использовать URI Intent (см. this). Здесь мой код, который устанавливает намерение и помещает его в тело сообщения электронной почты:

Intent customIntent = new Intent(CUSTOM_ACTION);
customIntent.setPackage(MY_PACKAGE);
customIntent.addCategory(MY_CAT_BROWSABLE);
customIntent.addCategory(MY_CAT_DEFAULT);

String customUri = customIntent.toUri(Intent.URI_INTENT_SCHEME);

String emailBody = getString(R.string.intent_link, customUri);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_SUBJECT, "Recommending vid");
intent.putExtra(Intent.EXTRA_TEXT   , Html.fromHtml(emailBody));
try {
    startActivity(Intent.createChooser(intent, "Choose email client:"));
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}

Это то, что я получаю от LogCat:

08-25 17:01:23.333: VERBOSE/Test URI(16987): intent:#Intent;action=com.test.project.action.VIEW_VID_FROM_LINK;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;package=com.test.project;end
08-25 17:01:23.338: VERBOSE/Test email text(16987): Hi,<br><br>Testing intents from an email.<br><br> A standard website: <a href=http://www.google.com>Go to Google</a>.<br><br> This link should launch the app: <a href=intent:#Intent;action=com.test.project.action.VIEW_VID_FROM_LINK;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;package=com.test.project;end>Click link to launch</a>.

Когда я просматриваю электронную почту с моего телефона с помощью приложения GMail, я могу нажать на ссылку Google и запустить браузер, без проблем.

Но ссылка на намерение даже не доступна для кликов (хотя из черновика она выглядит как клик). Кто-нибудь пробовал это и заставлял его работать?

From draft: link looks clickableSent email: link not clickable

EDIT # 1: Я также попытался настроить действие на Intent.ACTION_VIEW, но ссылка по-прежнему не доступна.

РЕДАКТИРОВАТЬ # 2: По-видимому, ссылка действительно доступна для кликов. Я попробовал использовать другой почтовый клиент, и ссылки можно щелкнуть! Похоже, в GMail есть ошибка. Ну что ж. Но, по-видимому, это сложнее, чем я думал. Я попытался использовать:

Uri.Builder builder = new Uri.Builder();
builder.scheme("my.own.scheme");
builder.authority("my.authority");
Uri newUri = builder.build();
Intent customIntent = new Intent(CUSTOM_ACTION, newUri);

Как было предложено @CommonsWare, я попытался проверить, есть ли приемники этого customIntent. По-видимому, есть одно, чего я ожидал. Итак, следующий шаг - сделать это намерение в URI, который я могу использовать в письме. Я использовал:

String customUri = customIntent.toUri(Intent.URI_INTENT_SCHEME);

который, основываясь на моем понимании документации, должен дать мне что-то вроде обычных HTTP-ссылок, только с установленной схемой intent. Затем я могу использовать этот customUri как значение для ссылок в письме. НО, похоже, что это не так. Есть ли у кого-нибудь пример того, что должен вернуть .toUri?

Ответ 1

Вы можете использовать котировки вокруг своих URL-адресов в своих <a> -элементах, поскольку именно так должно быть написано HTML.

Вы также можете попробовать подтвердить через parseUri(), PackageManager и queryIntentActivities(), если ваш сгенерированный URL-адрес разрешает что-либо - если это не так, тогда возникает проблема с URL-адресом.

Вот пример проекта, показывающий использование URI_INTENT_SCHEME, если он дает вам какие-либо идеи.

Ответ 2

Используйте флаг нуля для создания URI с помощью вашей пользовательской схемы. Intent.URI_INTENT_SCHEME флаг заставляет использовать схему "намерение:" (и сумасшедший синтаксис URI общего намерения).

String customUri = customIntent.toUri(0);