Android Deep Linking问题!如何使用自定义URL方案myapp:// some_data

时间:2013-11-25 12:54:57

标签: android deep-linking

我尝试了link1link2link3link4link5link6

以下是关于DeepLinking

的所有内容

我想要的是自定义uri myapp:// some_data,打开设备中安装的本机应用程序,需要some_data来初始化应用程序。

有两种情况可以点击自定义网址。

1)在短信应用中,当用户点击链接时,它应自动打开已安装的,否则打开应用程序所在的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类型的u url时打开本机应用程序,无论是来自短信应用程序还是gmail / yahoomail电子邮件正文。

为了达到同样的目的,我使用了意图过滤器来设置方案。和getIntent()读取MainActivity中等于a1b22c333的数据。

5 个答案:

答案 0 :(得分:16)

点击链接表示此代码可以使用

          <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);

答案 1 :(得分:9)

  

更具体地说,我想在点击inderbagga:// a1b22c333类型的u url时打开本机应用程序,无论是来自短信应用程序还是gmail / yahoomail电子邮件正文。

有许多适用于Android的短信和电子邮件应用程序。确切地说,没有人知道将inderbagga://a1b22c333转换为可点击的条目。您可以构建所有这些应用程序的列表,联系每个开发团队,并要求他们添加它。

或者,您可以让您的应用关注特定的http://网址。虽然会向用户显示选择器,但要在您的应用程序或Web浏览器中查看该URL,至少它是可点击的。

答案 2 :(得分:2)

您可能还想试用这个库,这有助于声明深层链接并提取您需要的参数:

https://github.com/airbnb/DeepLinkDispatch

它允许您声明您感兴趣的URI以及您希望通过注释提取的参数,而无需自己进行解析。

答案 3 :(得分:0)

看起来您遇到的问题是您的电子邮件和SMS客户端未正确解析URI方案和路径。大多数不允许您直接输入URI方案。此外,如果未安装该应用,您需要回退到Play商店,以便为用户提供良好的体验。

为此,您需要在客户端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>

或者,您可以使用像branch.io这样的服务,除了在桌面和iOS上工作外,还可以为您自动组装此客户端JS。

答案 4 :(得分:0)

根据我的知识和阅读所有答案和评论后,我理解的东西很少。

实施深层链接

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 代码片段 (link)