如何在安卓系统中打开深度链接URI?

4
例如,有一个uri example://activityone?foo=bar,可以通过这个adb命令打开应用并启动其中的一个活动。
adb shell am start -W -a android.intent.action.VIEW -d "example://activityone?foo=bar" com.example.deeplinking

除了通过这个uri (example://activityone?foo=bar)启动安卓应用程序之外,还有其他的方法吗?我该如何将这个uri放在电子邮件中,当它被点击时,启动应用程序?


<a href="example://activityone">link</a> - Simon Marquis
当嵌入电子邮件时,这种方法无法正常工作。 - s-hunter
1
为了电子邮件的兼容性,请使用真实的deeplink或chrome意图链接:https://developer.chrome.com/multidevice/android/intents - Simon Marquis
你能举个例子吗? - s-hunter
示例在链接中。 - Simon Marquis
无法使其正常工作。 - s-hunter
2个回答

11

首先,您应该阅读此文档:Intents and Intent Filters。具体地,是“接收隐式Intent”一节。

正如其他人所说,使用自定义方案存在问题。

  • 它们并不总是被视为链接
  • 您不能像拥有域名(主机)那样拥有它们。

因此,您应该在清单文件中定义一个活动,并使用真实的方案来过滤您的主机。请参见Intent & Intent Filters文档中的“Action Test”,“Category Test”和“Data Test”部分,以了解如何针对您的特定用例进行配置。

<activity android:name="com.example.app.ActivityOne">
    <intent-filter>
        <data android:scheme="http"/>
        <data android:host="example.com"/>
        <data android:path="/activityone"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>

然后您将能够使用以下链接。
http://example.com/activityone?foo=bar

由于这是一个http链接,系统会询问用户选择使用哪个应用打开它(您的应用或他们偏好的浏览器)。如果他们选择您的应用,则会启动ActivityOne并获取查询数据,如下所示。
public class ActivityOne extends Activity {

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        Uri uri = intent.getData();
        String foo = uri.getQueryParameter("foo");
    }

}

如果您在意图过滤器中使用自定义方案,那么您(很可能)将是唯一注册处理该意图的应用程序,并且用户不必选择您的应用程序。但是,您要在电子邮件中包含具有自定义方案的链接将更加困难。大多数电子邮件客户端不会将任何具有自定义方案的内容识别为链接,并且无法单击。

我该如何在电子邮件中插入此URI,并在其被点击时启动应用程序? - s-hunter
我已经更新了我的答案,只包括链接和更多关于应用程序选择/启动过程的信息,当它被点击时。你可以通过电子邮件将其发送给自己进行测试。 - mpkuth
如果你使用 Gmail(可能还有其他电子邮件客户端),你必须明确告诉它,你希望 http://example.com/activityone?foo=bar 被视为链接而不是纯文本。请选中文本,然后在发送按钮旁边的工具栏上点击“插入链接”。 - mpkuth
我知道http将起作用,我在发布此问题之前已经尝试过了。我正在寻找如何打开自定义URI(例如://activityone?foo=bar),即使方案不是HTTP,我也希望能够打开深度链接。 - s-hunter
问题不在你的应用程序设置上。问题是任何自定义方案在任何短信或电子邮件客户端中都很可能无法点击。请参阅此SO帖子 - mpkuth
是的,我不是在寻找应用程序本身的设置,而是想知道如何通过自定义URI(例如://activityone?foo=bar)启动应用程序,而不是使用adb命令行。 - s-hunter

2

非标准的URL方案(如example://)并不总是被视为链接。您最好的选择是将该URL包装在应用程序可以识别的链接中(http://https://),然后通过某种自动重定向方式稍后打开您的应用程序。这就是我们处理事情的方式,以确保无论链接在哪里打开,应用程序始终会启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接