Android深度链接问题!如何使用自定义Url方案myapp://some_data

Android深度链接问题!如何使用自定义Url方案myapp://some_data,android,deep-linking,Android,Deep Linking,我试过 这里描述的一切 我想要的是自定义urimyapp://some_data,打开设备中安装的本机应用程序,该应用程序需要一些_数据来初始化应用程序 有两种情况可以单击自定义url 1) 在SMS应用程序中,当用户点击链接时,应自动打开已安装的应用程序,否则应打开应用程序所在的googleplay商店 2) 从电子邮件正文中 我已经尝试了上面列出的所有链接,但没有一个适合我。我对计划部分有很大的问题 这是我的AndroidManifest.xml <?xml version="1.0"

我试过

这里描述的一切

我想要的是自定义urimyapp://some_data,打开设备中安装的本机应用程序,该应用程序需要一些_数据来初始化应用程序

有两种情况可以单击自定义url

1) 在SMS应用程序中,当用户点击链接时,应自动打开已安装的应用程序,否则应打开应用程序所在的googleplay商店

2) 从电子邮件正文中

我已经尝试了上面列出的所有链接,但没有一个适合我。我对计划部分有很大的问题

这是我的AndroidManifest.xml

<?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网页

“它们都不适合我”——这不是很有用。“我对方案部分有问题”——这也不是很有用。请编辑您的问题,在deatil中解释您遇到的具体问题。您想在浏览器中键入url时打开应用程序,对吗?@commonware:谢谢您的建议@prakash:我想从邮件正文中打开应用程序,比如说在浏览器中运行的gmail原生应用程序或gmail web应用程序。第二种情况可能是,该应用程序也可以通过点击短信应用程序内的链接启动。我使用了http方案,它为用户提供了通过浏览器或您的应用程序打开链接的选项。请查看此链接,facebook、twitter、ebay、youtube已经在这样做了。inderbagga只不过是一个自定义方案值,我在前面提到的链接中看到,人们已经在使用自定义方案,这是另一个支持教程,先生。好了
          <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>