Android 使用自定义 URI 进行深度链接
Android Deep Linking with custom URI
我的清单中定义了以下内容:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.package">
...
<activity
android:name="app.myActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<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:host="www.example.com"
android:pathPrefix="/gizmos"
android:scheme="http" />
<!-- note that the leading "/" is required for pathPrefix-->
<!-- Accepts URIs that begin with "example://gizmos”-->
<data
android:host="gizmos"
android:scheme="example" />
</intent-filter>
</activity>
...
并且我已经这样定义了我的 onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Uri data = intent.getData();
if (data != null) {
Log.d("URI",data.toString());
}
}
这与 Android 文档一致:Android Deep Linking
所以问题是:
如何测试 URI 深层链接?根据文档我 运行 类似
adb shell am start
-W -a android.intent.action.VIEW
-d "example://gizmos" com.app.package
但这会产生:
Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.app.package }
我还尝试了 shell 以及 activity 的名称和引用,启动器 activity 并将包装留空。我唯一可以开始工作的是:
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/gizmos"
但即使我实现了这一点,也并不意味着它可以在其他应用程序中运行。 CUSTOM URI(例如 example://gizmos)在 Gmail 和 WhatsApp 等其他应用程序中不可点击 - 因此在 Android 生态系统中进行测试也是有问题的。
答案 at this stack overflow question 不可接受,因为它没有回答问题,而只是鼓励使用 http:// 版本,我希望 example:// 方案有效。
ADB 正在发送意图,只是当您需要多个 link 类型时,您的应用必须具有单独的意图过滤器:
<activity
android:name="app.myActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "example://gizmos”-->
<data
android:host="gizmos"
android:scheme="example" />
</intent-filter>
<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:host="www.example.com"
android:pathPrefix="/gizmos"
android:scheme="http" />
<!-- note that the leading "/" is required for pathPrefix-->
</intent-filter>
</activity>
那么下面的 ADB 命令都有效:
adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos"
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/gizmos"
但是我遇到了将更多元素附加到自定义 URI 的问题(例如 example://gizmos?data1='hello'&data2='world' - '&' 被截断)
显然,这并不能解决这些 link 在其他应用程序(如 WhatsApp 和 Gmail)中不可点击的事实......但它们在其他平台上可点击。
正如其他答案所提到的,android 框架要求您为您在应用程序中启用的每个深度 link 声明单独的 intent-filters。这就是您收到错误的原因。
此外,您可以直接在 android 上使用 deep link tester app 测试 deep links,而不是使用 adb:
https://play.google.com/store/apps/details?id=com.manoj.dlt
无需提及任何包名或组件名。只需输入实际深度 link 并开火。
我曾与深度 links 合作过,就我个人而言,我发现通过 adb 进行测试非常耗时。因此,我创建了这个用于直接测试深度 links 的应用程序,并将其发布到 Play 商店。
airbnb
有 DeepLinkDispatch 个图书馆。它将解决您处理 DeepLink
.
的所有后顾之忧
库具有以下功能:
- 易于使用
- 处理所有类型的自定义 URL
- link 参数中的句柄
- 处理查询参数
我的清单中定义了以下内容:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.package">
...
<activity
android:name="app.myActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<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:host="www.example.com"
android:pathPrefix="/gizmos"
android:scheme="http" />
<!-- note that the leading "/" is required for pathPrefix-->
<!-- Accepts URIs that begin with "example://gizmos”-->
<data
android:host="gizmos"
android:scheme="example" />
</intent-filter>
</activity>
...
并且我已经这样定义了我的 onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Uri data = intent.getData();
if (data != null) {
Log.d("URI",data.toString());
}
}
这与 Android 文档一致:Android Deep Linking
所以问题是:
如何测试 URI 深层链接?根据文档我 运行 类似
adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos" com.app.package
但这会产生:
Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.app.package }
我还尝试了 shell 以及 activity 的名称和引用,启动器 activity 并将包装留空。我唯一可以开始工作的是:
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/gizmos"
但即使我实现了这一点,也并不意味着它可以在其他应用程序中运行。 CUSTOM URI(例如 example://gizmos)在 Gmail 和 WhatsApp 等其他应用程序中不可点击 - 因此在 Android 生态系统中进行测试也是有问题的。
答案 at this stack overflow question 不可接受,因为它没有回答问题,而只是鼓励使用 http:// 版本,我希望 example:// 方案有效。
ADB 正在发送意图,只是当您需要多个 link 类型时,您的应用必须具有单独的意图过滤器:
<activity
android:name="app.myActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "example://gizmos”-->
<data
android:host="gizmos"
android:scheme="example" />
</intent-filter>
<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:host="www.example.com"
android:pathPrefix="/gizmos"
android:scheme="http" />
<!-- note that the leading "/" is required for pathPrefix-->
</intent-filter>
</activity>
那么下面的 ADB 命令都有效:
adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos"
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/gizmos"
但是我遇到了将更多元素附加到自定义 URI 的问题(例如 example://gizmos?data1='hello'&data2='world' - '&' 被截断)
显然,这并不能解决这些 link 在其他应用程序(如 WhatsApp 和 Gmail)中不可点击的事实......但它们在其他平台上可点击。
正如其他答案所提到的,android 框架要求您为您在应用程序中启用的每个深度 link 声明单独的 intent-filters。这就是您收到错误的原因。
此外,您可以直接在 android 上使用 deep link tester app 测试 deep links,而不是使用 adb:
https://play.google.com/store/apps/details?id=com.manoj.dlt
无需提及任何包名或组件名。只需输入实际深度 link 并开火。
我曾与深度 links 合作过,就我个人而言,我发现通过 adb 进行测试非常耗时。因此,我创建了这个用于直接测试深度 links 的应用程序,并将其发布到 Play 商店。
airbnb
有 DeepLinkDispatch 个图书馆。它将解决您处理 DeepLink
.
库具有以下功能:
- 易于使用
- 处理所有类型的自定义 URL
- link 参数中的句柄
- 处理查询参数