2010-08-25 1 views
7

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

Согласно @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 но ссылка еще не кликабельны.

EDIT # 2: По-видимому, ссылка действительно is clickable. Я попробовал использовать другой почтовый клиент, и ссылки можно щелкнуть! Похоже, в 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?

+0

Это длится долго, но я думаю, что нашел проблему. Это намерение. Я хочу, чтобы ссылка появлялась: 'Intent {act = com.test.project.action.CUSTOM_ACTION dat = com.test.project: //my.authority}'.Вместо этого я получаю это намерение, когда я нажимаю на ссылку в письме: «Intent {act = android.intent.action.VIEW dat = intent: //my.authority#Intent; schem = com.test.project; действие = com.test.project.action.CUSTOM_ACTION; end (имеет дополнительные функции)} '. Основываясь на документации Intent.parseUri (String uri, int flags), клиент электронной почты интерпретирует мой URI как * NOT *, сгенерированный toUri(). Правильно ли мое предположение? – Zarah

+0

Вы могли заставить это работать и каково было решение? Благодаря! – hopia

+0

@hopia Я не пробовал это снова в течение длительного времени. Вы можете посмотреть комментарии между мной и CommonsWare ниже, чтобы посмотреть мои выводы во время расследования. Вы также можете попробовать более новый ответ ниже (еще не пробовал). :) – Zarah

ответ

4

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

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

Here is a sample project, показывающий использование URI_INTENT_SCHEME, в случае, если он дает вам какие-либо идеи.

+0

(whooops, что-то не так с форматированием там). Посмотрите свою ссылку для обработчика URL, спасибо! Но я думаю, что я столкнусь с этим препятствием, как только я получу ссылку для кликабельности. Также попробует проверить URL-адрес, сообщит вам об этом. :) Спасибо, как всегда! :) – Zarah

+0

@ Zarah: Я хочу сказать, что ссылка не может быть нажата, если Android не сможет найти что-либо для обработки щелчка. – CommonsWare

3

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

String customUri = customIntent.toUri(0);