同时支持 Android 和 Android TV 的 Android Studio 项目

2023-12-25

我正在尝试创建一个同时支持 Android(手机/平板电脑)和 AndroidTV 的 AndroidStudio 项目。目标是在手机/平板电脑和 AndroidTV 上拥有类似的功能,同时不需要另一个来操作,并重用代码。

当我创建一个新项目时,我是否:

  • a) 在“手机和平板电脑”和“电视”上都打勾吗?
  • b) 勾选“手机和平板电脑”并根据本指南进行改造:https://developer.android.com/training/tv/start/start.html https://developer.android.com/training/tv/start/start.html
  • c) 勾选“TV”并改造主要活动?

我已经尝试过 b) 但电话 (5.0) 和 ADT-1 都获得相同的布局。

下面是我的清单文件(MainActivity 放置在 MainActivityTV 之前)。当我运行它时,电话和 ADT-1 都会加载电话布局。但是,当我将 MainActivityTV 放在 MainActivity 之前时,我的手机和 ADT-1 都会加载 Leanback 布局。如何使手机仅加载 MainActivity,而 ADT-1 仅加载 MainActivityTV?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidretrofitwithtv" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-feature
        android:name="android.software.leanback"
        android:required="false" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:banner="@drawable/app_icon_your_company"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivityTV"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|navigation"
            android:theme="@style/Theme.Leanback">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DetailsActivity" />
        <activity android:name=".PlaybackOverlayActivity" />
        <activity android:name=".BrowseErrorActivity" />
    </application>

</manifest>

是的,手机/平板电脑和 Android TV 应用程序可以有一个 APK 文件,因为电视应用程序使用与手机和平板电脑相同的结构。这种相似性意味着您可以修改现有应用程序,使其也可以在电视设备上运行,或者根据您对构建 Android 应用程序的了解来创建新应用程序。

在开始构建电视应用程序之前,您必须: 将您的 SDK 工具更新到版本 24.0.0 或更高版本。更新的 SDK 工具使您能够构建和测试电视应用程序。 使用 Android 5.0 (API 21) 或更高版本更新您的 SDK。更新后的平台版本为电视应用程序提供了新的 API。 创建或更新您的应用程序项目。为了访问电视设备的新 API,您必须创建一个项目或修改面向 Android 5.0(API 级别 21)或更高版本的现有项目。

  1. 宣布电视活动

打算在电视设备上运行的应用程序必须在其清单中使用CATEGORY_LEANBACK_LAUNCHER http://developer.android.com/reference/android/content/Intent.html#CATEGORY_LEANBACK_LAUNCHER意图过滤器。此过滤器会将您的应用识别为支持电视,并且是您的应用在 Google Play 中被视为电视应用所必需的。声明此意图还可以确定当用户在电视主屏幕上选择其图标时要启动应用程序中的哪个活动。

如果您正在修改现有应用程序以在电视上使用,则您的应用程序不应使用与手机和平板电脑相同的活动布局。电视应用程序(或现有应用程序的电视部分)的用户界面应提供更简单的界面,可以使用沙发上的遥控器轻松导航。有关设计电视应用程序的指南,请参阅电视设计指南 http://developer.android.com/design/tv/index.html。有关电视界面布局最低实现要求的更多信息,请参阅构建电视布局。 http://developer.android.com/training/tv/start/layouts.html

以下代码片段展示了如何将此意图过滤器包含在清单中:

<application
     android:banner="@drawable/banner" >
     ...
     <activity
          android:name="com.example.android.MainActivity"
          android:label="@string/app_name" >

          <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
     </activity> 

     <activity
          android:name="com.example.android.TvActivity"
          android:label="@string/app_name"
          android:theme="@style/Theme.Leanback">

          <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
               </intent-filter>
          </activity>
</application>
  1. 声明 Leanback 支持

声明您的应用使用 Android TV 所需的 Leanback 用户界面。如果您正在开发在移动设备(手机、可穿戴设备、平板电脑等)以及 Android TV 上运行的应用程序,请将所需的属性值设置为 false。如果您将必需的属性值设置为 true,您的应用程序将仅在使用 Leanback UI 的设备上运行。

<manifest>
      <uses-feature android:name="android.software.leanback"
            android:required="false" />
       ...
</manifest>
  1. 声明不需要触摸屏

您的电视应用程序的清单必须声明不需要 android.hardware.touchscreen 功能。此设置将您的应用标识为能够在电视设备上运行,并且是您的应用在 Google Play 中被视为电视应用所必需的。以下代码示例展示了如何包含此清单声明:

<manifest>
     <uses-feature android:name="android.hardware.touchscreen"
          android:required="false" />
     ...
</manifest>
  1. 提供主屏幕横幅

如果应用程序包含 Leanback 启动器意图过滤器,则它必须为每个本地化提供主屏幕横幅。横幅是出现在主屏幕上的应用程序和游戏行中的应用程序启动点。清单中的横幅描述如下:

<application
      ...
      android:banner="@drawable/banner" >
      ...
</application>

将 android:banner 属性与标记一起使用可为所有应用程序活动提供默认横幅,或与标记一起使用为特定活动提供横幅。

See Banners http://developer.android.com/design/tv/patterns.html#banner在电视 UI 模式设计指南中。

  1. 添加电视支持库

Android SDK 包含旨在与电视应用程序一起使用的支持库。这些库提供了可在电视设备上使用的 API 和用户界面小部件。这些库位于/extras/android/support/目录中。以下是库及其一般用途的列表:

  1. v17 Leanback 库 http://developer.android.com/tools/support-library/features.html#v17-leanback- 为电视提供用户界面小部件 应用程序,尤其是进行媒体播放的应用程序。
  2. v7 recyclerview 库 http://developer.android.com/tools/support-library/features.html#v7-recyclerview- 提供管理显示的类 以内存有效的方式存储长列表。中的几个班级 v17 Leanback 库依赖于该库中的类。
  3. v7 卡片视图库 http://developer.android.com/tools/support-library/features.html#v7-cardview- 提供用户界面小部件 显示信息卡,例如媒体项目图片和 描述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同时支持 Android 和 Android TV 的 Android Studio 项目 的相关文章

  • 适用于 IOS 和 Android 的支付网关 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个应用程序 用户必须在澳大利亚餐馆通过应用程序 android ios 付款 有两种付款方式 通过 PayPal 或 Visa
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 当不支持 Google Play 应用内结算 V.3 时

    在 Google Play 的应用内结算 V 3 中 有一个选项可以检查用户设备是否支持它 使用是否支持计费 http developer android com google play billing versions html meth
  • Android 版 jTwitter 授权错误

    我在我的 Android 应用程序中使用 jTwitter 库 直到前天一切都运转良好 但今天遇到异常 服务提供商响应错误 301 请帮助我 这是堆栈跟踪 02 21 21 07 27 258 E AndroidRuntime 4013 F
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • Emma 不生成coverage.ec

    我设置了艾玛 它曾经对我有用 然后我们更改了源代码 现在它没有生成coverage ec根本不 它确实生成coverage em 测试临近结束时 出现错误消息 exec INSTRUMENTATION CODE 0 echo Downloa
  • Android 纹理仅显示纯色

    我正在尝试在四边形上显示单个纹理 我有一个可用的 VertexObject 它可以很好地绘制一个正方形 或任何几何对象 现在我尝试扩展它来处理纹理 但纹理不起作用 我只看到一种纯色的四边形 坐标数据位于 arrayList 中 the ve
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • Jetpack 导航:如何从一个嵌套图的子级导航到另一个嵌套图的子级?

    导航结构 MainActivity nav root HomeFragment AuthNestedGraph nav auth BeforeOtpFragment home OtpFragment ProfileNestedGraph n
  • TextInputLayout 对于在 EditText 中以编程方式给出提示没有效果

    我有一个 EditText 它的父级是 TextInputLayout 我试图以编程方式为 EditText 提供提示 不在布局中 在这种情况下 文本输入提示动画不起作用 它像简单的 EditText 一样工作 有人可以建议如何处理它吗 下
  • 如何构建自定义摄像机应用程序?

    我正在尝试开发一个自定义摄像机录像机 当我的设备在 Activity 的 beginRecording 中执行 start MediaRecorder 方法时 应用程序崩溃 我不知道出了什么问题 因为我遵循谷歌API指南 http deve
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • Android 地理围栏无法正常工作(未调用 IntentService)

    这是我的代码 安卓清单
  • Android AdMob:addView 在返回活动之前不会显示广告

    我正在尝试在游戏顶部添加横幅广告 我的活动使用带有自定义 SurfaceView 的relativelayout 我希望广告与 SurfaceView 重叠 广告会加载并可点击 但不会绘制到屏幕上 当我离开活动并返回时 会绘制广告 例如 通
  • 在 Android 手机中通过耳机插孔发送数据

    我目前正在处理一个新项目 我必须通过具有特定电压的耳机插孔发送数据 然后我可以在该电压上工作 所以这里我需要根据我的数据来编程具体电压 我是否可以在android中访问耳机的输出电压 然后创建一个应用程序来控制该电压 这是一篇讨论此问题的
  • 我应该如何在 Android 上使用 Retrofit 处理“无互联网连接”

    我想处理没有互联网连接的情况 通常我会运行 ConnectivityManager cm ConnectivityManager context getSystemService Context CONNECTIVITY SERVICE N

随机推荐

  • Swift 闭包在作为 Objective-C 块调用时崩溃

    在我的项目中 我同时拥有 Objective C 和 Swift 代码 我有一些对象的属性包含用于清理某些 UITableView 配置的块 在 Objective C 中使用它可以工作 但在使用 Swift 时会崩溃 我已将问题减少到尽可
  • 如何使用 JQuery 和 RegEx 检查 URL 是否包含 http

    如何使用 jQuery 和 RegEx 在给定 url 中检查并添加 http 如果不存在 我尝试了以下方法 jQuery text box url blur function if jQuery this val if jQuery th
  • 如何强制 lambda 定义的新实例化

    Java 规范保证给定的 lambda 定义 例如 gt Hello World 被编译 转换为确切的一个实现类 每个定义 而不是每个 看起来 相同的出现 有什么方法可以强制 java compiler jvm 生成新的 lambda 定义
  • 使用 ReSharper 突出显示所选对象的所有出现位置

    我曾经使用 RockScroll 或 MetalScroll 但是当我开始使用 ReSharper 时 我的 RockScroll 开始出现一些错误 好吧 这是另一个讨论的范围https stackoverflow com question
  • 返回值或传递指针作为参数?

    我了解到 为了通过调用函数来访问或修改变量的值 我们需要将指针作为参数传递 如下所示 include
  • 即使未安装可选依赖项,Python setuptools 也会安装控制台脚本

    我目前正在开发一个包 并对 setuptools 感到困惑 该包包含许多依赖项 有了这些依赖项 可以通过 cli 执行多个脚本 E G gt main pkg gt main pkg which needs dep1 gt main pkg
  • 如何使用 C# 检查邮件已读或未读属性 (Lotus Notes)

    我想使用 C 检查邮件已读和未读属性 即想检查邮件是否被阅读 使用Domino dll 未读标记表不会通过 后端类 这是您最有可能在 Domino dll 中使用的类 公开 这可以通过较低级别的 C API 获得 需要处理更多的工作 但如果
  • 带有 PL/pgSQL 的 CRC32 函数

    如何计算 32 位循环冗余校验 CRC 32 作为 PostgreSQL 中的函数 方法与MySQL http dev mysql com doc refman 5 7 en mathematical functions html func
  • decltype(..., void()) 和 void_t 之间的区别

    上次我发现了许多关于 SFINAE 的答案 建议使用void t帮手 但我似乎不明白它有什么特别之处 decltype void 考虑这个例子 template
  • 类继承,强制新类实现某些功能

    好吧 我正在搞一些事情 特别是接口 假设我有一个类 猫 其基础为 动物 动物有一个方法 如下所示 public virtual void Walk Do walking stuff 所以 Cat 会用以下内容覆盖它 public overr
  • 如何为同源的 iframe 提供单独的 sessionStorage

    标准 W3C 标准对 localStorages 的描述如下 不同的作者共享一个主机名 例如用户在geocities com 所有共享一个本地存储对象 没有通过路径名限制访问的功能 因此 敦促共享主机上的作者避免使用这些功能 因为其他作者读
  • 在 Flask 中上传图片

    我必须在项目目录的静态文件夹中上传一些图像 但我不知道如何对我的代码说 在下面的 code py 中 我可以上传图像并将其存储在静态文件夹同一级别的项目目录中 但我希望该图像可以存储在静态文件夹内 app route uploader me
  • 根据 python 中的列表测试用户输入

    我需要测试用户输入是否与列表的元素相同 现在我正在这样做 cars red yellow blue guess str input if guess cars 1 or guess cars 2 print success 但是我正在处理更
  • 包私有类中的公共方法

    将方法标记为有什么区别吗public在包私有类中 class SomePackagePrivateClass void foo package private method public void bar public method 之间的
  • 如何将参数传递到 Flex/actionscript 中的事件侦听器函数中?

    因为当使用 sql lite 时 如果你尝试同时执行一个函数 它会抛出一个错误 我只是想创建一个函数来检查它是否正在执行 如果它在 10 毫秒内重试 这个函数就可以正常工作如果我不必向函数传递任何参数 但我很困惑如何将变量传递回它将执行的函
  • Pandas 到 Excel 条件格式整列

    我想将 Pandas 数据框写入 Excel 并格式化 为此我正在使用xlsxwriter 我的问题有两个 首先 如何将条件格式应用于整列 在里面examples http xlsxwriter readthedocs io example
  • 如何在Python内部列表中运行嵌套循环,以便外部循环始终从列表的下一个元素开始,依此类推

    我有一个类似的列表 16777230 0 16777226 1 16777252 2 16777246 0 我想在 python 中的操作的循环 嵌套循环 内创建一个循环 以便内部循环始终从外部循环的下一个元素开始 例如 外循环将在每次迭代
  • '(' 或 '[' 预期

    尝试编译我的程序时出现以下错误 预期为 或 public AccountArrayList line one below is the hi lighted code ArrayList accounts new ArrayList acc
  • Python 模块初始化

    在模块代码中初始化模块中的对象是不好的做法吗 in Module py class Foo object def init self self x Foo Foo Foo 与用户代码相比 您可以 gt gt gt from Module i
  • 同时支持 Android 和 Android TV 的 Android Studio 项目

    我正在尝试创建一个同时支持 Android 手机 平板电脑 和 AndroidTV 的 AndroidStudio 项目 目标是在手机 平板电脑和 AndroidTV 上拥有类似的功能 同时不需要另一个来操作 并重用代码 当我创建一个新项目