Android 深度链接问题!如何使用自定义 URL 方案 myapp://some_data
Posted
技术标签:
【中文标题】Android 深度链接问题!如何使用自定义 URL 方案 myapp://some_data【英文标题】:Android Deep Linking issue ! How to use Custom Url scheme myapp://some_data 【发布时间】:2013-12-10 05:09:51 【问题描述】:我试过link1、link2、link3、link4、link5、link6
这里是关于DeepLinking的所有描述
我想要的是自定义 uri myapp://some_data,打开设备中安装的本机应用程序,该应用程序需要 some_data 来初始化应用程序。
自定义url可以点击的场景有2种。
1) 在 SMS 应用程序中,当用户点击链接时,它应该会自动打开已安装的应用程序,否则会打开托管应用程序的 googleplay 商店
2) 来自电子邮件的正文。
我已经尝试了上面列出的所有链接,但它们都不适合我。我在方案部分遇到了重大问题。
这是我的 androidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="inderbagga" />
</intent-filter>
</activity>
</application>
这是 MainActivity.java
TextView tvText=(TextView)findViewById(R.id.tvid);
if (getIntent().getAction() == Intent.ACTION_VIEW&&getIntent().getScheme().equals("inderbagga"))
Toast.makeText(getApplicationContext(), ""+getIntent().getScheme(), Toast.LENGTH_SHORT).show();
Uri uri = getIntent().getData();
// do stuff with uri
tvText.setText(uri.toString());
else tvText.setText("NULL");
更具体地说,我想在单击 inderbagga://a1b22c333 类型的 url 时打开本机应用程序,无论是来自短信应用程序还是 gmail/yahoomail 电子邮件正文。
为了达到同样的效果,我使用了意图过滤器来设置方案。和getIntent()读取MainActivity中等于a1b22c333的数据。
【问题讨论】:
“它们都不适合我”——这不是很有用。 “我的方案部分有问题”——这也不是很有用。请编辑您的问题,详细解释您遇到的具体问题。 您想在浏览器中输入 url 时打开应用程序正确吗? @commonsware:感谢您的建议! @prakash :我想从电子邮件正文打开应用程序,比如在浏览器中运行的 gmail 本机应用程序或 gmail Web 应用程序。第二种情况可能是,也可以通过点击短信应用中的链接来启动应用。 我使用了 http 方案,它为用户提供了通过浏览器或实现该方案的应用程序打开链接的选项。 【参考方案1】:点击链接意味着此代码将起作用
<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"
android:host="domain.com(google.com)"android:pathPrefix="/wp/poc1/(sufexes)" />
</intent-filter>
获取网址数据
//get uri data
Uri data = getIntent().getData();
//get schma
String scheme = data.getScheme(); // "http"
//get server name
String host = data.getHost(); // Ipaddress or domain name
//get parameter
String urltextboxname=data.getQueryParameter("name");
//set value in textview
name.setText(urltextboxname);
【讨论】:
这段代码行不通,我需要一个自定义方案……而不是 http 的东西。 现在我才看到你的答案,但是“方案”可以自定义,你可以定义最适合你的。但我猜你可能会在 2 年后发现 :)【参考方案2】:更具体地说,我想在单击 inderbagga://a1b22c333 类型的 url 时打开本机应用程序,无论是来自短信应用程序还是 gmail/yahoomail 电子邮件正文。
有许多适用于 Android 的 SMS 和电子邮件应用程序。确切地说,他们都不知道将inderbagga://a1b22c333
转换为可点击的条目。您可以建立所有这些应用的列表,联系他们的每个开发团队,并要求他们添加。
或者,您可以让您的应用监视特定的http://
URL。虽然会向用户显示一个选择器,但要在您的应用程序或 Web 浏览器中查看该 URL,至少它是可点击的。
【讨论】:
请看一下这个链接,en.wikipedia.org/wiki/Mobile_deep_linking facebook、twitter、ebay、youtube 已经在做这个了。 inderbagga 只不过是一个自定义方案值,我在我提到的链接中看到人们已经在使用自定义方案,如 这是另一个支持教程,先生 sparq.it/web/api/v1/docs/mobile_uris#deep_linking 和 deeplink.me/documentation 。必须有办法实现这一目标。但它在我的情况下不起作用..我做错了。可能是这样! @inderbagga:是的。任何支持链接到http
或https
URL 的短信或电子邮件应用程序都知道将您的 http
URL 转换为链接。然后,应用程序会盲目地要求 Android 处理链接,这将显示选择器(您的应用程序,还是浏览器?)。理想情况下,使用您控制的 Web 服务器上的实时页面 URL,以便您可以让该页面向用户提供下载应用程序或从选择器中选择您的说明。
@CommonsWare:一切正常,先生!如果应用程序已经安装,我想绕过选择器选项默认选择应用程序而不是询问是通过浏览器还是应用程序打开?
@inderbagga:你无法控制它。 用户可以,如果他们在选择器中有“始终”或“设为默认”或等效选项。【参考方案3】:
您可能还想尝试这个库,它有助于声明深层链接并提取您需要的参数:
https://github.com/airbnb/DeepLinkDispatch
它允许您通过注释声明您感兴趣的URI和您想要提取的参数,而无需自己进行解析。
【讨论】:
【参考方案4】:您遇到的问题似乎是您的电子邮件和 SMS 客户端未正确解析 URI 方案和路径。大多数不允许您直接输入 URI 方案。此外,如果未安装该应用,您需要回退到 Play 商店,以便为用户提供良好的体验。
为此,您需要在客户端 JS 中调用 URI 方案。您可以设置一个简单的网络主机并使用此脚本:
<script type="text/javascript">
window.onload = function()
var method = 'iframe';
var fallbackFunction = function()
if (method == 'iframe')
window.location = "market://details?id=your.package.name";
;
var addIFrame = function()
var iframe = document.createElement("iframe");
iframe.style.border = "none";
iframe.style.width = "1px";
iframe.style.height = "1px";
iframe.src = "inderbagga://a1b22c333";
document.body.appendChild(iframe);
;
var loadChromeIntent = function()
method = 'intent';
document.location = "intent://a1b22c333#Intent;scheme= inderbagga;package=your.package.name;end";
;
if (navigator.userAgent.match(/Chrome/) && !navigator.userAgent.match("Version/"))
loadChromeIntent();
else if (navigator.userAgent.match(/Firefox/))
window.location = "inderbagga://a1b22c333";
else
addIFrame();
setTimeout(fallbackFunction, 750);
;
</script>
或者,您可以使用branch.io 之类的服务,除了在桌面和 ios 上工作之外,它还会自动为您组装此客户端 JS。
【讨论】:
【参考方案5】:根据我的知识和阅读所有答案和cmets,我理解的东西很少。
实现深层链接
OP 的 AndroidManifest.xml
实现是正确的。添加 <data android:scheme="inderbagga" />
将为所有以“inderbagga”开头的 URL 添加深层链接。所以inderbagga://something.com
会起作用。
测试深层链接
不要通过点击 SMS 应用上的链接来测试您的实现,而是尝试遵循 Android Deeplink documentation 中提到的这个 ADB 命令。
$ adb shell am start
-W -a android.intent.action.VIEW
-d <URI> <PACKAGE>
为什么在浏览器/短信上测试链接可能不起作用?
根据我的经验,大多数聊天应用程序(包括 WhatsApp)不会将自定义架构 URL 转换为可点击链接。在 Gmail 上发送自定义方案 URL 也不起作用。此外,在 Google Chrome (Android) 上输入 inderbagga://something.com
将执行 Google 搜索,而不是向您的应用发送意图。
那么什么有效呢?
使用 ADB cmd (link) 测试您的实施 创建一个 html 网页<a href="YOURSCHEME://something.com/" target="_blank">
。如果你愿意,试试这个 w3school 代码 sn-p (link)
【讨论】:
以上是关于Android 深度链接问题!如何使用自定义 URL 方案 myapp://some_data的主要内容,如果未能解决你的问题,请参考以下文章
Android - Branch.io 深度链接在 chrome 中不起作用
如何将 CakePHP 2 模型关联更改为与 bindModel 和自定义查找器的深度链接?
PHP:正则表达式,如何验证 android 和 ios 深层链接 URI
Android 调试应用程序未使用 branch.io 打开