当前位置: 首页 > 知识库问答 >
问题:

Android与自定义URI的深度链接

公良子轩
2023-03-14

我的清单中定义了以下内容:

<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深度链接

所以问题是:

如何测试URI深层链接?根据留档,我运行类似

adb shell am start-W-aAndroid系统。意图行动视图-d“example://gizmos“com.app.package

但这产生了:

错误:活动未启动,无法解决意图{act=android.intent.action.VIEW dat=示例://gizmos flg=0x10000000 pkg=com.app.package}

我还尝试了带有活动名称和引用的shell,启动程序活动,并将包留空。我唯一能去工作的是:

adb shell am start-W-aAndroid系统。意图行动视图-d“http://www.example.com/gizmos"

但即使我做到了这一点,也不能说它能在其他应用程序中运行。自定义URI(例如。example://gizmos)在Gmail和WhatsApp等其他应用程序中无法点击,因此在Android生态系统中进行测试也存在问题。

这个堆栈溢出问题的答案是不可接受的,因为它不回答这个问题,而只是鼓励使用http://版本,我希望示例://方案起作用。

共有3个答案

陶英达
2023-03-14

这里有airbnb的DeepLinkDisfix库,它将解决您处理DeepLink的所有烦恼。

图书馆有如下特点:

  • 易于使用
秦安怡
2023-03-14

正如另一个答案所提到的,android框架要求您为应用程序中启用的每个深度链接声明单独的意图过滤器。这就是你出错的原因。

此外,您可以使用deep link tester app直接在android上测试深度链接,而不是使用adb:

https://play.google.com/store/apps/details?id=com.manoj.dlt

无需提及任何包名或组件名,只需键入实际的深层链接并开火即可。

我与深度链接一起工作,我个人发现通过adb进行测试非常耗时。因此,我创建了这个应用程序来直接测试深度链接,并将其放在play store上。

袁耀
2023-03-14

ADB正在发送意图,只是当你想要多个链接类型时,你的应用程序必须有单独的意图过滤器:

    <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-aandroid.intent.action.VIEW-d"示例://gizmos"
adb shell am start-W-aandroid.intent.action.VIEW-d"http://www.example.com/gizmos"

然而,我遇到了在自定义URI上附加更多元素的问题(例如。example://gizmos?data1=“你好”

显然,这并不能解决这样一个事实,即这些链接在其他应用程序中是不可点击的,比如WhatsApp和Gmail。。。但它们也可以在其他平台上点击。

 类似资料:
  • 我正在实现Android深度链接的概念,它工作正常,我的问题是,如果应用程序没有安装在手机上,我想将链接重定向到我的play store应用程序页面。 请引导我找到它,谢谢。

  • 根据这个- 关于第一个意图过滤器,我知道当点击的链接是“http://www.example.com/gizmos”时,它会重定向到带有意图过滤器的应用页面。但是关于第二个意图过滤器“示例://gizmos”,这看起来不像是一个有效的网络网址,也没有有效的网络网址会从这个开始。那么为什么应用程序使用这样的意图过滤器呢?我见过很多这样的意图过滤器,在这些类型中,结合主机和方案并不构成一个合适的网络网

  • 我启用了深度链接,还创建了文件夹。 当点击一个URL应用程序打开相关的内容。 我的应用程序中有一个按钮,可以在网络浏览器中打开内容。但是,再次打开链接时,会再次打开应用程序。 我看到我可以尝试设置软件包的目的是,但这不是一个干净的解决方案,因为一些Android用户可能会使用其他浏览器。 我怎样才能正确地做到这一点?

  • 问题内容: 我对如何执行此操作一无所知。我的进度条应该是云的形状。有人可以将我引导到书本,教程中,还是只提供正确的逐步方法? 感谢您的时间。 问题答案: 如此处所示,您可以使用图像视图来获得自定义滚动条效果。 在该示例中,自定义进度栏的布局XML是: 然后他在类文件中创建图像列表,如下所示: 然后,他启动一个睡眠0.3秒的线程,并使用调用处理程序,最后在Handler中,完成图像的其余工作: 也可

  • 有可能是这样的深层链接吗我有这样的链接http://example.com/shortlink当它被打开到浏览器时,它将重定向到http://example.com/product?id=123然后在那里,我将打开我的应用程序,直接转到id为123的产品 我有这样的想法 [IntentFilter(新[]{Intent.ActionView}, Categories=new[]{Intent.Ca

  • 我正在使用branch.io为我的Android应用程序实现一个延迟的深度链接 我正在处理用户点击链接但没有安装应用程序的用例(安装应用程序时我的链接已经起作用了)。目前,我的应用程序不是放在Play Store上,而是放在Fabric上。因此,我设置了深度链接,将用户重定向到类似https://betas.to/...的url。这样他最终就可以下载测试版,然后再下载应用程序。 不幸的是,我无法使