【问题标题】:AndroidStudio project that supports both Android and AndroidTV支持 Android 和 Android TV 的 Android Studio 项目
【发布时间】:2015-04-29 17:16:10
【问题描述】:

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

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

我尝试过 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>

【问题讨论】:

  • 这当然是受支持的东西,但是您需要针对电视和手机/平板电脑进行单独的活动(电视的leanback 库在手机/平板电脑上不能很好地工作,反之亦然,使用 Material 主题)。你能发布一些代码或你的应用程序是如何崩溃的吗?
  • 我从这里 (developer.android.com/training/tv/start/start.html) 用 Android TV 改造了我的空白 Android 应用程序。没有错误。但问题是电话和电视都在加载相同的布局。清单(上图)中出现的第一个活动似乎是两者都出现的。谢谢。

标签: android android-tv


【解决方案1】:

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

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

  1. 声明电视活动

打算在电视设备上运行的应用程序必须在其清单中使用CATEGORY_LEANBACK_LAUNCHER 意图过滤器声明电视的启动器活动。此过滤器将您的应用识别为已启用电视,并且您的应用需要在 Google Play 中被视为电视应用。声明此意图还可以确定当用户在电视主屏幕上选择其图标时要在您的应用中启动哪个 Activity。

如果您要修改现有应用以在电视上使用,则您的应用在电视上使用的 Activity 布局不应与在手机和平​​板电脑上使用的相同。您的电视应用程序(或现有应用程序的电视部分)的用户界面应提供更简单的界面,可以使用沙发上的遥控器轻松导航。有关为电视设计应用程序的指南,请参阅TV Design guide。有关电视界面布局的最低实现要求的更多信息,请参阅Building TV Layouts.

以下代码 sn-p 显示了如何在清单中包含此意图过滤器:

<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。如果您将 required 属性值设置为 true,您的应用将仅在使用 Leanback UI 的设备上运行。

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

您的 TV 应用的清单必须声明不需要 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 属性与标签一起使用可为所有应用程序活动提供默认横幅,或与标签一起为特定活动提供横幅。

请参阅《电视设计指南的 UI 模式》中的 Banners

  1. 添加电视支持库

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

  1. v17 leanback library - 为电视提供用户界面小部件 应用,尤其是播放媒体的应用。
  2. v7 recyclerview library - 提供管理显示的类 以内存有效的方式处理长列表。中的几个班 v17 leanback 库依赖于该库中的类。
  3. v7 cardview library - 提供用户界面小部件 显示信息卡,例如媒体项目图片和 描述。

【讨论】:

  • 这个答案就文档而言是正确的,但在最初的问题中我仍然遇到了与@Gerard 相同的问题。我正在使用 Xamarin,但我不认为这会导致与 Android Studio 不同的行为。
【解决方案2】:

您可以通过检测您运行的设备类型来做到这一点。我会在您的 MainActivity 中执行此操作,方法是检查 UImode,然后启动 TVActivity(如果它在 Tv 上运行,如下所示)

uiMode = (UiModeManager) getSystemService(UI_MODE_SERVICE)
if(uiMode.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION){
    //then start TvActivity here
    ...
}

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2013-05-11
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多