Android深度链接问题!如何使用自定义Url方案myapp://some_data
我试过 这里描述的一切 我想要的是自定义urimyapp://some_data,打开设备中安装的本机应用程序,该应用程序需要一些_数据来初始化应用程序 有两种情况可以单击自定义url 1) 在SMS应用程序中,当用户点击链接时,应自动打开已安装的应用程序,否则应打开应用程序所在的googleplay商店 2) 从电子邮件正文中 我已经尝试了上面列出的所有链接,但没有一个适合我。我对计划部分有很大的问题 这是我的AndroidManifest.xmlAndroid深度链接问题!如何使用自定义Url方案myapp://some_data,android,deep-linking,Android,Deep Linking,我试过 这里描述的一切 我想要的是自定义urimyapp://some_data,打开设备中安装的本机应用程序,该应用程序需要一些_数据来初始化应用程序 有两种情况可以单击自定义url 1) 在SMS应用程序中,当用户点击链接时,应自动打开已安装的应用程序,否则应打开应用程序所在的googleplay商店 2) 从电子邮件正文中 我已经尝试了上面列出的所有链接,但没有一个适合我。我对计划部分有很大的问题 这是我的AndroidManifest.xml <?xml version="1.0"
<?xml version="1.0" encoding="utf-8"?>
更具体地说,我想在打开类型为i的url时打开本机应用程序nderbagga://a1b22c333 从sms应用程序或gmail/yahoomail电子邮件正文中单击
为了达到同样的效果,我使用了意图过滤器来设置方案。和getIntent()读取MainActivity中等于a1b22c333的数据
更具体地说,我想在打开类型为i的url时打开本机应用程序nderbagga://a1b22c333 从sms应用程序或gmail/yahoomail电子邮件正文中单击
Android上有很多短信和电子邮件应用程序。他们中完全没有人知道如何转换inderbagga://a1b22c333
进入可点击的条目。您可以建立所有这些应用程序的列表,联系他们的每个开发团队,并要求他们添加这些应用程序
或者,您可以让应用程序监视特定的
http://
URL。虽然用户将看到一个选择器,但要在您的应用程序或Web浏览器中查看该URL,至少它是可单击的。单击链接意味着此代码将起作用
<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>
您可能还想试用这个库,它有助于声明深度链接和提取所需的参数:
它允许您声明感兴趣的URI和要通过注释提取的参数,而无需自己进行解析。您面临的问题似乎是您的电子邮件和SMS客户端没有正确解析URI方案和路径。大多数不允许您直接输入URI方案。此外,如果未安装应用程序,您需要退回到Play Store,以便为用户提供良好的体验 为了做到这一点,您需要在客户端JS中调用URI方案。您可以设置一个简单的web主机并使用以下脚本:
<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>
window.onload=函数(){
var方法='iframe';
var fallbackFunction=function(){
if(方法=='iframe'){
window.location=”market://details?id=your.package.name";
}
};
var addIFrame=函数(){
var iframe=document.createElement(“iframe”);
iframe.style.border=“无”;
iframe.style.width=“1px”;
iframe.style.height=“1px”;
iframe.src=“inderbagga://a1b22c333";
document.body.appendChild(iframe);
};
var loadChromeIntent=函数(){
方法='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";
}
否则{
addIFrame();
}
设置超时(fallbackFunction,750);
};
或者,您可以使用这样的服务,除了在桌面和iOS上工作之外,还可以为您自动组装此客户端JS。根据我的知识,在阅读了所有答案和评论后,我了解了一些事情 实施深度链接 OP的
AndroidManifest.xml
实现是正确的。添加
将为所有以“inderbagga”开头的URL添加deeplink。所以inderbagga://something.com
将起作用
测试深度链接
不要通过点击SMS应用程序上的链接来测试您的实现,而是尝试遵循上面提到的ADB命令
$adb外壳am开始
-W-a android.intent.action.VIEW
-d
为什么在浏览器/SMS上测试链接可能不起作用?
根据我的经验,大多数聊天应用程序(包括WhatsApp)不会将定制的计划URL转换为可点击的链接。同样,在Gmail上发送定制的有计划的URL也不起作用。另外,输入inderbagga://something.com
在谷歌Chrome(Android)上,用户将进行谷歌搜索,而不是向应用程序发送意图
那么什么有效呢
- 使用ADB cmd()测试您的实现
- 创建HTML网页
)
<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);
<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>
$ adb shell am start
-W -a android.intent.action.VIEW
-d <URI> <PACKAGE>