Fire TV UI特色内容的深层链接
深层链接是指绕过应用主页,将用户定向到应用内的特色内容的链接。对于广告,深层链接将用户从广告位置导向广告中推广的内容(假定用户已下载应用)。要设置深层链接,必须提供指向内容的深层链接意图,该意图经过编码。然后,亚马逊执行市场活动的此深层链接意图。
特色内容深层链接
深层链接将用户从Fire TV操作系统导向Fire TV上应用中的特定目标。在特色内容中,深层链接将用户导向推广的内容。
例如,若在“ACME媒体”广告位置处,刊登有足球赛复赛消息,任何ACME客户点击足球赛复赛时,链接都指向应用内复赛页面,以便观看比赛或记录下来(以便将来观看)。
如果客户未在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命令的创建,操作步骤如下:
-
创建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文档中的意图参数的规范。深层链接创建的基本信息,请参阅创建应用内容的深层链接。
- 将ADB连接到Fire TV并运行ADB命令。(有关连接的帮助信息,请参阅通过ADB连接到Fire TV。)
- 确保Fire TV上显示正确的媒体。(如果adb命令失败,下一节中生成的编码深层链接也失败。)
步骤2: 使用Android Studio对您的深层链接意图进行编码
需要将adb命令(深层链接意图)转换为编码字符串。为此,您需要下载一个简单的Android应用。该应用有一个包含各种方法的类,您可以根据需要自定义这些方法。在应用中,将从ADB命令中获取参数,并存储在名为amazonIntent
的意图对象中。
将所有ADB参数添加到amazonIntent
中后,toURI
方法将此amazonIntent
对象转换为编码的URI字符串。编码的URI字符串包含来自adb命令的所有信息(动作、程序包、组件、标记、额外信息等)。运行Android应用时,编码的URI字符串会在Logcat控制台中输出。
要在Android Studio中生成编码的深层链接意图,请执行以下操作:
- 下载这个简单的Android应用:toURI下载后,解压缩它。
-
打开Android Studio并打开toURI应用。(当您打开应用时,Android Studio将自动更新Android SDK的位置。)
-
在
MainActivity.java
文件(app/java/com/example/touri内)中,根据注释中的描述自定义代码。有六个部分可以自定义。注意: 自定义的详细信息,包含在应用的注释中。为了方便起见,这些说明也粘贴在下面。以下代码是应用的范围(减去Android清单文件)。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”。经过编码的深层 // 链接意图将显示在那里。 }
- 完成自定义代码后,单击Run App(运行应用)按钮,在任何设备(任何模拟器或连接的Fire TV设备等)上运行应用。
-
打开Logcat并筛选单词“amazon”。该值显示在“amazon_intent=:”之后。
该值是编码的字符串,如下所示:
amzns://apps/android?asin=B123ABC456#Intent;S.intentToFwd=https%3A%2F%2Fwww.acme.com%2Fsome%2Fshow%2Frrn%3Acontent%3Ashows%3A123456789;end
- 复制该值,并将其发送给亚马逊代表。
深层链接破坏后的处理
大多数情况下,用户单击市场活动,应用中的媒体将打开播放。但是,对于打开应用前已产生的破坏,或者深层链接中媒体不可用的情况,应进行处理。在这些情况下,您可能决定将用户指向主页。
下图显示了深层链接可能被破坏的情况。
单击市场活动后,如果用户没有应用,则会转至应用详情页面,其中包含下载应用的选项。只要应用详情页面保持有效状态,深层链接意图就将存储在内存中。 (这种情况又称“延迟深层链接”。)但是,如果用户离开具体页面,则存储的意图数据将被删除。
例如,假设用户安装了应用,但在打开应用之前,用户导航到别处(可能是用户没有耐心等待下载完成)。当用户返回并打开应用时,深层链接内容已经被删除,因为用户离开了应用详情页面。在这些情况下,请将用户带到您的主页。
常见问题解答
- 如何在我的应用中实现深层链接功能?
- 更多详情,请参阅Android文档中的创建应用内容的深层链接。
- 如何判断应用是否已准备好深层链接?
- 如果您可以通过adb命令(深层链接意图)在应用中播放媒体,则您的应用已准备就绪,无需更新。
- 如何知道我的深层链接在Fire TV上是否起作用?
- 可将adb连接到Fire TV并运行adb命令,以确保Fire TV上显示的媒体正常(如步骤1所述)。如果您的adb命令正常工作,并且您按照有关生成编码的深层链接字符串的说明操作,则深层链接应该起作用。亚马逊将通过内部工具测试深层链接。用户无法自行测试编码的深层链接意图。
- 如果用户尝试打开已被破坏的深层链接,或者深层链接指向已移动或丢失的媒体,应用会如何动作?
- 链接应优雅退出,例如显示应用的默认主页。
- 你们是否支持延迟深层链接?
- 是。延迟深层链接,是在应用中缓存特定目标的机制,在用户首次下载,打开应用时,会将用户指向应用中缓存的特定目标(即便用户并未下载应用)。在本文档中,所有对“深层链接”的引用,都同时包括深层链接,以及延迟深层链接。仅当用户完成下载,以及打开应用前未离开应用具体页面时,延迟深层链接有效。