使用意图URI启动我的应用程序

7
我知道这个问题在StackOverflow上已经被问了很多次,但我还没有找到一个解决方案。我的应用程序发送一封电子邮件,其中包含一个链接,点击该链接应该启动应用程序。
根据@hackbod的说法,最好的方法是利用Intent URI(请参见此处)。以下是我的代码,它设置了意图并将其放入电子邮件正文中:
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链接并启动浏览器,这没有问题。但是,意图的链接甚至都无法点击(尽管从草稿中看起来它应该是可点击的)。有人尝试过这个并使它工作吗?
编辑#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 必须返回的示例吗?

这个问题有点长,但我认为我找到了问题所在。这是我想要链接生成的 Intent:Intent { act=com.test.project.action.CUSTOM_ACTION dat=com.test.project://my.authority }。但是,当我点击邮件中的链接时,我得到的 Intent 是这样的:Intent { act=android.intent.action.VIEW dat=intent://my.authority#Intent;scheme=com.test.project;action=com.test.project.action.CUSTOM_ACTION;end (has extras) }。根据 Intent.parseUri(String uri, int flags) 文档,邮件客户端解释我的 URI 不是由 toUri() 生成的。我的假设正确吗? - Zarah
你能让它工作了吗?解决方案是什么?谢谢! - hopia
@hopia 我已经很久没有再尝试过这个了。你可以查看我和CommonsWare之间的评论,来了解我在调查期间的发现。你也可以尝试下面更新的答案(我还没有尝试过)。 :) - Zarah
是的,我刚试了这些建议,似乎都不起作用。我开始觉得 intent: scheme 在安卓浏览器上不受支持。实际上,我可以通过 adb shell 命令行启动活动:am start "intent:#Intent;action=...." - hopia
2个回答

4

@Zarah:我的意思是,如果Android找不到任何东西来处理点击,那么链接可能无法被点击。 - CommonsWare
@CommonsWare:我尝试更换用于检查邮件的电子邮件应用程序,而不是使用GMail应用程序,我尝试使用手机中内置的应用程序。毕竟链接是可点击的。但你是对的,看起来操作系统不知道要处理哪个活动/包的点击。我得到了网页不可用的屏幕。 - Zarah
这是我对此的发现,也许我做错了什么或者漏掉了什么,我不知道。在执行 .toUri 之前,我尝试检查意图是否有接收器。操作系统找到了意图接收器,所以我继续将其放入电子邮件正文中。然而,当我点击电子邮件中的链接时,仍然会出现“网页不可用”的屏幕。这对我来说似乎是矛盾的。你有任何想法吗? - Zarah
@Zarach:据我所知,你不应该需要一个主机。我链接的示例项目没有主机,当在浏览器应用程序中查看URL时,它可以正常工作。我猜想,当电子邮件客户端解析URL时,它们会在途中略微损坏它。我不知道你能做什么。如果在浏览器中单击链接可以正常工作,但在电子邮件客户端中单击链接无法正常工作,那么我的怀疑是问题出在电子邮件客户端上。 - CommonsWare
@CommonsWare: 我也是这么认为的。我查看了toUri()的源代码,看起来我最终得到了正确的字符串。然而,当电子邮件客户端解析链接时,它们没有使用正确的标志进行解析方法(parseUri(String, int)),根据API应该设置为URI_INTENT_SCHEME。我还使用手机浏览器打开了电子邮件,我认为它不识别除http或https之外的方案,因此没有链接。 - Zarah
显示剩余3条评论

3
使用零标志创建具有自定义方案的URI。 Intent.URI_INTENT_SCHEME 标志强制使用“intent:”方案(以及整个意图URI疯狂的语法)。
String customUri = customIntent.toUri(0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接