【问题标题】:invoking application activity from url in email从电子邮件中的 url 调用应用程序活动
【发布时间】:2015-08-24 10:23:47
【问题描述】:
我有一个包含 4 个不同活动的应用程序。
我正在实现从发送到电子邮件客户端 (Gmail) 的 url 启动活动的方案。
用户收到电子邮件,它有 2 个链接:
- 链接 1 是打开实时屏幕(活动 1)
- 链接 2 是打开播放屏幕(活动 2)
在我的应用程序清单文件中,我为活动 1 和活动 2 创建了意图过滤器。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
</intent-filter>
问题
- 当我使用自定义方案(例如“myapp”)时,Gmail 内的链接不可点击。如果我将方案添加为“http”,我只能单击该链接。这是 android 电子邮件客户端的缺点吗?如何克服这个问题并使用可点击的自定义网址。
- 由于我在清单文件中添加了两个意图过滤器,当我单击电子邮件中的 url 链接时,它会打开一个选择器对话框来选择应用程序。
在里面,我的应用程序图标显示了 2 次。
我希望我的应用程序图标只显示一次。并根据链接,它应该打开活动 1 或 2。
根据清单文件中给出的意图过滤器,该图标似乎出现了多次。我该如何克服这个问题
【问题讨论】:
标签:
java
android
android-intent
deep-linking
custom-url
【解决方案1】:
当我使用自定义方案(例如“myapp”)时,Gmail 内的链接不可点击。如果我将方案添加为“http”,我只能单击该链接。这是 android 电子邮件客户端的缺点吗?如何克服这个问题并使用可点击的自定义 url。
不幸的是,它是否想与自定义 URL 方案配合得很好取决于 GMail。
一种常用的解决方案是链接到将用户重定向到自定义 URL 方案的网站。
由于我在清单文件中添加了两个意图过滤器,当我单击电子邮件中的 url 链接时,它会打开一个选择器对话框来选择应用程序。在里面,我的应用程序图标显示了 2 次。我希望我的应用程序图标只显示一次。并根据链接,它应该打开活动 1 或 2。根据清单文件中给出的意图过滤器,图标似乎出现了多次。我该如何克服这个问题
只为您要拦截的每个唯一 URI 方案注册一个意图过滤器。
如果您的应用需要解析数据以确定去往何处,那么您可以将该逻辑放在主 Activity 中,或者创建一个特殊 Activity 仅用于解析链接并将意图过滤器放在该 Activity 的清单条目中.
如果你真的在使用<data android:scheme="http" />,那么你的<data> 标签就太模糊了。您可以通过添加主机或路径属性使它们更具体,以便您的链接仅解析为您的意图过滤器之一,而不是全部。
【解决方案2】:
免责声明:我为 branch.io 工作,每天大约有 18 小时考虑移动链接。
问题 2 首先,因为它更容易。它显示了两次图标,因为您已经为同一个 URI 注册了两次应用程序。就像您的手机上有多个浏览器一样,它们都会注册http 方案,这样当点击 http 链接时,各个浏览器图标就会出现在选择器中。
现在问题 1,关于通过电子邮件打开您的应用程序。首先,您可以使用Branch link 自动为您完成所有这些操作。这非常简单,我强烈推荐它。但是,如果您拥有无限的资源并想自己构建它,或者只是想了解它是如何工作的,让我在下面解释一下。
首先,从最佳实践的角度来看,您永远不想只将您的 URI 方案 (myapp://) 放在公共消息中,因为如果未安装应用程序,所有浏览器都会抛出错误消息。您需要一些客户端 javascript 来回退到 Play 商店。最糟糕的是,几乎所有浏览器都以不同的方式处理这个问题。例如,Twitter 的 webview 与 Chrome 非常不同。
以下是一些示例客户端 JS,用于打开 Facebook 应用程序和帖子的深层链接,但如果未安装,则正确回退到 Play 商店。它处理一些最常见的浏览器。
<script type="text/javascript">
window.onload = function() {
var method = 'iframe';
var fallbackFunction = function() {
if (method == 'iframe') {
window.location = "market://details?id=com.facebook.katana";
}
};
var addIFrame = function() {
var iframe = document.createElement("iframe");
iframe.style.border = "none";
iframe.style.width = "1px";
iframe.style.height = "1px";
iframe.src = "fb://page/838619192839881";
document.body.appendChild(iframe);
};
var loadChromeIntent = function() {
method = 'intent';
document.location = "intent://page/838619192839881#Intent;scheme=fb;package=com.facebook.katana;end";
};
if (navigator.userAgent.match(/Chrome/) && !navigator.userAgent.match("Version/")) {
loadChromeIntent();
}
else if (navigator.userAgent.match(/Firefox/)) {
window.location = "fb://page/838619192839881";
}
else {
addIFrame();
}
setTimeout(fallbackFunction, 750);
};
</script>
Branch 再次为您完成所有工作,并允许您通过 Play 商店进行深度链接,以提供个性化的新用户体验。