开发者控制台

Fire TV UI特色内容的深层链接

Fire TV UI特色内容的深层链接

深层链接是指绕过应用主页,将用户定向到应用内的特色内容的链接。对于广告,深层链接将用户从广告位置导向广告中推广的内容(假定用户已下载应用)。要设置深层链接,必须提供指向内容的深层链接意图,该意图经过编码。然后,亚马逊执行市场活动的此深层链接意图。

深层链接将用户从Fire TV操作系统导向Fire TV上应用中的特定目标。在特色内容中,深层链接将用户导向推广的内容。

例如,若在“ACME媒体”广告位置处,刊登有足球赛复赛消息,任何ACME客户点击足球赛复赛时,链接都指向应用内复赛页面,以便观看比赛或记录下来(以便将来观看)。

如果客户未在Fire TV上下载应用,市场活动会将用户导向应用中的具体页面,用户可选择是否下载,打开应用。用户下载、打开应用后,直接转到市场活动推广的内容。

深层链接可将市场活动中显示的内容,无缝过渡到(具有相同内容的)应用中。因此,总体而言,对于Fire TV上显示的特色内容,深层链接更及时、连贯。

Fire TV上深层链接的新功能

以前,当客户点击Fire TV上特色内容时,会指向该应用的具体页面(即便已经下载了该应用)。应用中内容的深层链接技术,得益于技术的飞速发展。

先决条件

需要使用Android Studio和ADB生成经过编码的深层链接意图。默认情况下,ADB与Android Studio一起安装。如果您首次接触ADB,需要详细了解设置方法,请参阅Android文档中的Android调试桥(ADB)

需要在简单应用中自定义设置,以生成(编码后)深层链接的意图(intent)。深层链接意图的自定义,由adb命令参数决定。对于相应内容,要生成编码后的深层链接意图,请参考以下两节的内容:

步骤1: 创建适用于adb命令(通过该命令,为媒体生成深层链接)。

对于媒体,若已知其深层链接意图,可直接进入下一节,步骤2: 通过Android Studio对深层链接意图进行编码。不过,仍应配置adb命令,以便测试是否符合媒体(因为提交前,没有其他方法测试深层链接意图)。

媒体adb命令的创建,操作步骤如下:

  1. 创建adb命令,提供深层链接意图(intent)。例如,媒体播放所用的adb命令如下所示:

    adb shell am start -a android.intent.action.VIEW -n air.ACMEMobilePlayer/.ACMEActivity -d http://app.site.acme.com/amazonfiretv/?channel=acme
    

    在Android中,深层链接结构可能不同,各应用所采用的结构,由具体应用决定。命令中可能采用不同的参数和元素。ADB命令通常采用adb shell am start和以下参数:

    • -a(动作)- 指定意图动作
    • -n(程序包 + 组件)- 指定程序包和组件名称
    • -d(数据URI)- 指定意图数据URI

    有关传递给adb的参数的说明,请参阅Android文档中的意图参数的规范。深层链接创建的详细信息,请参阅创建应用内容的深层链接

  2. 将ADB连接到Fire TV并运行ADB命令。(有关连接的帮助信息,请参阅通过ADB连接到Fire TV。)
  3. 确保Fire TV上显示正确的媒体。(如果adb命令失败,下一节中生成的编码深层链接也失败。)

需要将adb命令(深层链接意图)转换为编码字符串。为此,您需要下载一个简单的Android应用。该应用有一个包含各种方法的类,您可以根据需要自定义这些方法。在应用中,将从ADB命令中获取参数,并存储在名为amazonIntent的意图对象中。

将所有ADB参数添加到amazonIntent中后,toURI方法将此amazonIntent对象转换为编码的URI字符串。编码的URI字符串包含来自adb命令的所有信息(动作、程序包、组件、标记、额外信息等)。运行Android应用时,编码的URI字符串会在Logcat控制台中输出。

要在Android Studio中生成编码的深层链接意图,请执行以下操作:

  1. 下载这个简单的Android应用:toURI下载后,解压缩它。
  2. 打开Android Studio并打开toURI应用。(当您打开应用时,Android Studio将自动更新Android SDK的位置。)

  3. MainActivity.java文件(app/java/com/example/touri内)中,根据注释中的描述自定义代码。有六个部分可以自定义。

    package com.example.touri;
    
    import android.content.ComponentName;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    // 1.指定应用的ASIN。(如果不知道您的ASIN,请转到
    // 亚马逊应用商店中您的应用。ASIN显示在“产品详情”下。)
            String asin = "B123ABC456";
    
    // 将以下行保持原样。在此处,您会新建一个名为
    // amazonIntent意图对象,其中存储着ADB命令的所有参数。
    
            Intent amazonIntent = new Intent();
    
    // 2.指定操作。在ADB命令中,获取-a参数中的值
    //并将其作为参数插入到下面的方法中,替换
    // android.intent.action.VIEW。如果您的ADB命令中没有-a参数,// 将现有值保持原样(不要注释掉)。
    
            amazonIntent.setAction("android.intent.action.VIEW");
    
    // 3.指定任何标记。在ADB命令中,获取-f参数中的值
    //并将其作为参数插入到下面的方法中,替换
    // Intent.FLAG_ACTIVITY_SINGLE_TOP。然后取消注释该行。如果ADB命令中没有任何
    //标记,请跳过此部分。
    
            //amazonIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
    // 4.指定类和组件。在ADB命令中,获取
    //-n参数中的值,并将其作为参数插入到下面的ComponentName方法中。在
    // ADB命令中,一个斜杠将程序包名称与组件分隔开来。在
    // 此处的参数格式中,按照所示格式,用一个逗号
    // 将程序包与组件分开。如果您没有-n参数,请跳过此部分。
    
            //amazonIntent.setComponent(new ComponentName("tv.acme.android","tv.acme.android.leanback.controller.LeanbackSplashOnboardActivity"));
    
    // 5.指定任何额外信息。在ADB命令中,获取-e参数中的值
    //并按照所示键值对格式,将其作为参数插入到
    // 下面的.putExtra方法中。如果您没有-e参数,请跳过此部分。
    
            //amazonIntent.putExtra("acme_id", 12345);
    
    // 6.指定数据。在ADB命令中,获取-d参数中的值并
    // 将其作为参数插入到下面的.Uri.parse方法中。(此处假定您的
    // 内容ID是一个URI。) 如果您的ADB命令中没有-d参数,请跳过
    // 此部分。
    
            //amazonIntent.setData(Uri.parse("https://www.acme.com/some/show/rrn:content:shows:123456789"));
    
            Intent DeepLinkIntent = new Intent(Intent.ACTION_VIEW, android.net.Uri.parse("amzns://apps/android?asin=" + asin));
            DeepLinkIntent.putExtra("intentToFwd", amazonIntent.toURI());
            Log.i("amazon_intent=", DeepLinkIntent.toURI());
        }
    
     // 完成1到6中列出的任何自定义设置后,运行您的应用(在任何
     //模拟器或设备上)// 并打开Logcat来筛选“amazon”。经过编码的深层
     // 链接意图将显示在那里。
    }
    
  4. 完成自定义代码后,单击Run App(运行应用)按钮Run 'app',在任何设备(任何模拟器或连接的Fire TV设备等)上运行应用。
  5. 打开Logcat并筛选单词“amazon”。该值显示在“amazon_intent=:”之后。

    筛选amazon以获取编码的深层链接意图
    筛选amazon以获取编码的深层链接意图

    该值是编码的字符串,如下所示:

    amzns://apps/android?asin=B123ABC456#Intent;S.intentToFwd=https%3A%2F%2Fwww.acme.com%2Fsome%2Fshow%2Frrn%3Acontent%3Ashows%3A123456789;end
    
  6. 复制该值,并将其发送给亚马逊代表。

大多数情况下,用户单击市场活动,应用中的媒体将打开播放。但是,对于打开应用前已产生的破坏,或者深层链接中媒体不可用的情况,应进行处理。在这些情况下,您可能决定将用户指向主页。

下图显示了深层链接可能被破坏的情况。

深层链接的工作流程
深层链接的工作流程

单击市场活动后,如果用户没有应用,则会转至应用详情页面,其中包含下载应用的选项。只要应用详情页面保持有效状态,深层链接意图就将存储在内存中。 (这种情况又称“延迟深层链接”。)但是,如果用户离开具体页面,则存储的意图数据将被删除。

例如,假设用户安装了应用,但在打开应用之前,用户导航到别处(可能是用户没有耐心等待下载完成)。当用户返回并打开应用时,深层链接内容已经被删除,因为用户离开了应用详情页面。在这些情况下,请将用户带到您的主页。

常见问题解答

如何在我的应用中实现深层链接功能?
更多详情,请参阅Android文档中的创建应用内容的深层链接
如何判断应用是否已准备好深层链接?
如果您可以通过adb命令(深层链接意图)在应用中播放媒体,则您的应用已准备就绪,无需更新。
如何知道我的深层链接在Fire TV上是否起作用?
可将adb连接到Fire TV并运行adb命令,以确保Fire TV上显示的媒体正常(如步骤1所述)。如果您的adb命令正常工作,并且您按照有关生成编码的深层链接字符串的说明操作,则深层链接应该起作用。亚马逊将通过内部工具测试深层链接。用户无法自行测试编码的深层链接意图。
如果用户尝试打开已被破坏的深层链接,或者深层链接指向已移动或丢失的媒体,应用会如何动作?
链接应优雅退出,例如显示应用的默认主页。
你们是否支持延迟深层链接?
是。​延迟深层链接,是在应用中缓存特定目标的机制,在用户首次下载,打开应用时,会将用户指向应用中缓存的特定目标(即便用户并未下载应用)。在本文档中,所有对“深层链接”的引用,都同时包括深层链接,以及延迟深层链接。仅当用户完成下载,以及打开应用前未离开应用具体页面时,延迟深层链接有效。