草庐IT

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

coder 2023-12-15 原文

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

创建新项目时,请执行以下操作:

  • a)在“手机和平板电脑”以及“电视”上都打上复选标记?
  • b)在“手机和平板电脑”上打勾并根据此指南进行 retrofit :https://developer.android.com/training/tv/start/start.html
  • c)在“电视”上打勾并翻新主要 Activity ?

  • 我尝试过b),但电话(5.0)和ADT-1都只有相同的布局。

    以下是我的 list 文件(MainActivity位于MainActivityTV之前)。当我运行它时,电话和ADT-1都会加载电话布局。但是,当我将MainActivityTV放在MainActivity之前时,我的电话和ADT-1都将加载回落布局。如何使手机仅加载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文件,因为TV应用与手机和平板电脑使用相同的结构。这种相似性意味着您可以修改现有的应用程序,使其也可以在电视设备上运行,或者根据您已经了解的为Android构建应用程序的知识来创建新的应用程序。

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

  • 声明电视 Activity

  • 打算在电视设备上运行的应用程序必须使用CATEGORY_LEANBACK_LAUNCHER Intent 过滤器在其 list 中声明电视的启动器 Activity 。此过滤器会将您的应用标识为已启用电视功能,并且在Google Play中将其视为电视应用是必需的。声明此 Intent 还可以确定当用户在电视主屏幕上选择其图标时,该应用中要启动的 Activity 。

    如果您要修改现有的应用程序以在电视上使用,则您的应用程序不应在电视上使用与手机和平板电脑相同的 Activity 布局。电视应用程序(或现有应用程序的电视部分)的用户界面应提供一个更简单的界面,可以使用沙发上的 Remote 轻松地对其进行导航。有关设计电视应用程序的准则,请参见TV Design guide。有关电视接口(interface)布局的最低实现要求的更多信息,请参见Building TV Layouts.

    以下代码段显示了如何在 list 中包含此 Intent 过滤器:
    <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>
    
  • 声明Leanback支持

  • 声明您的应用使用Android TV所需的Leanback用户界面。如果要开发在移动设备(手机,可穿戴设备,平板电脑等)以及Android TV上运行的应用程序,请将必需的属性值设置为false。如果将required属性值设置为true,则您的应用程序将仅在使用Leanback UI的设备上运行。
    <manifest>
          <uses-feature android:name="android.software.leanback"
                android:required="false" />
           ...
    </manifest>
    
  • 无需声明触摸屏

  • 电视应用的 list 必须声明不需要android.hardware.touchscreen功能。此设置将您的应用标识为可以在电视设备上运行,并且在Google Play中将其视为电视应用是必需的。下面的代码示例演示如何包含此 list 声明:
    <manifest>
         <uses-feature android:name="android.hardware.touchscreen"
              android:required="false" />
         ...
    </manifest>
    
  • 提供主屏幕横幅

  • 如果应用程序包含Leanback启动器 Intent 过滤器,则它必须为每个本地化提供主屏幕横幅。标语是显示在应用程序和游戏行的主屏幕上的应用程序启动点。在 list 中描述横幅,如下所示:
    <application
          ...
          android:banner="@drawable/banner" >
          ...
    </application>
    

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

    请参阅《 UI模式电视设计指南》中的Banners
  • 添加电视支持库

  • Android SDK包括旨在与电视应用程序一起使用的支持库。这些库提供了可在电视设备上使用的API和用户界面小部件。这些库位于/extras/android/support/目录中。以下是库及其一般用途的列表:
  • v17 leanback library-提供电视的用户界面小部件
    应用程序,尤其是用于进行媒体播放的应用程序。
  • v7 recyclerview library-提供用于管理显示的类
    以内存高效的方式存储长列表。在几个类
    v17 leanback库取决于该库中的类。
  • v7 cardview library-提供用于的用户界面小部件
    显示信息卡,例如媒体项目图片和
    说明。
  • 关于同时支持Android和Android TV的Android Studio项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28757522/

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

    1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

      我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

    3. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

      我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

    4. Ruby 从大范围中获取第 n 个项目 - 2

      假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

    5. 安卓apk修改(Android反编译apk) - 2

      最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

    6. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

      我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

    7. ruby - 在 Rails 项目中测试本地版本的 gem - 2

      我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

    8. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

      在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

    9. ruby - 如何使用 readline 支持重新安装 ruby​​? - 2

      我已经按照https://github.com/wayneeseguin/rvm#installation上的说明通过RVM安装了Ruby.有关信息,我有所有文件(readline-5.2.tar.gz、readline-6.2.tar.gz、ruby-1.9.3-p327.tar.bz2、rubygems-1.8.24.tgz、wayneeseguin-rvm-stable.tgz和yaml-0.1.4.tar.gz)在~/.rvm/archives目录中,我不想在任何目录中重新下载它们方式。当我这样做时:sudo/usr/bin/apt-getinstallbuild-essent

    10. ruby-on-rails - "undefined method ` stub_request '"访问 RSpec 支持文件中的方法时 - 2

      我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re

    随机推荐