V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SupperMary
V2EX  ›  Android

什么属性会决定编译出来的安卓是 TV 还是手机

  •  
  •   SupperMary · 2020-07-27 14:45:14 +08:00 · 6851 次点击
    这是一个创建于 1340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    偶然发现一个 app 在手机上和 TV 上布局不一样。 能找到的 app 判断是否运行在 TV 上的代码只有这么一段:

    UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
    
    if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION)
    {  是 tv } 
    else 
    { 不是 tv }
    

    但是从网上搜索编译安卓 TV 的资料寥寥无几,想问一下哪些编译参数会决定编译出来的安卓是 TV 还是手机

    第 1 条附言  ·  2020-07-27 18:52:56 +08:00
    留言太多就不一一回复了,感谢各位的答复。

    这里再详细说明一下我的问题。我知道 APP 可以通过判断当前运行的平台是手机还是 TV,进而做出不同的布局。

    严格来说我遇到的这个 app 的问题在于,安装在手机上是,这个 app 实现了一个 Actionbar 。并且没有专门针对 TV 隐藏这个控件。 这个 APP 安装在 TV 上时,这个 Actionbar 就没有了。当然后来我改了系统的一些内容让这个控件显示了。
    更改的内容是安卓 TV 的一些布局属性。

    由上边的问题引申出来另外一个问题,就是什么情况下编译出来的安卓会是一个 TV,什么情况下编译出来的安卓是一个 Phone,还是说安卓自己会根据它运行的硬件来决定它是一个 TV 还是一个手机。
    第 2 条附言  ·  2021-10-10 23:19:24 +08:00
    过了两年来填坑。
    准确来说,编译 Android TV ROM 和手机与平板的 ROM 差异不是很大。但是安卓 TV 上会裁减掉一些手机上的功能,比如三大金刚键,导航栏,通知栏,状态栏这些。
    UiModeManager 里面 get 出来的 uimode 实际上来源于 OEM 厂商的配置,一般是在 /system/etc/permissions/***.xml 里面。
    从 AOSP 编译出来的 Android TV 位于这个文件里 tv_core_hardware.xml

    关键字段为 <feature name="android.hardware.type.television" />,如果下载了 AOSP,有兴趣的话可以研究一下。

    AOSP 内有现成的 Android TV 的 device 配置


    android_root_dir/device/google/atv
    19 条回复    2022-04-20 16:19:20 +08:00
    greed1is9good
        1
    greed1is9good  
       2020-07-27 14:57:51 +08:00 via Android   ❤️ 1
    屏幕参数吧
    zhiyzellda
        2
    zhiyzellda  
       2020-07-27 15:25:18 +08:00 via Android   ❤️ 1
    也有可能是机型和系统,我也发觉某个 App 在盒子上与在电视自带系统上显示不同。环境是创维电视酷开系统,盒子是类原生系统。像酷开&小米&智慧屏之类的应该是直接判断系统的吧,因为手机不可能安装电视独有系统。这其实跟 AppStore 判断你是 AppleTV 还是 iPad 是一样的原理。
    完善的 App 是三个要素同时判断 1.屏幕 2.机型 3.搭载的系统 。

    它是直接写了两款 UI,判断到电视就隐藏手机 UI,是手机就隐藏电视 UI 。是打开 app 时判断的,安装的时候大多数是两套 UI 一起装进去的,这时候不会判断。
    coderluan
        3
    coderluan  
       2020-07-27 15:27:22 +08:00   ❤️ 1
    楼主这搜索能力有待提高啊, 我不是做安卓的, 好奇就搜了下, 发现官方文档就有说明:

    https://developer.android.com/training/tv/start/start
    love
        4
    love  
       2020-07-27 16:25:36 +08:00   ❤️ 1
    SupperMary
        5
    SupperMary  
    OP
       2020-07-27 17:30:24 +08:00
    @coderluan 感谢答复。 其实我的意思是编译安卓系统的时候,哪些参数会表示编译出来的系统是 TV 还是手机或者手表之类的。 这一部分内容在网上确实没找到哈
    kop1989
        6
    kop1989  
       2020-07-27 17:37:37 +08:00   ❤️ 1
    编译出来的是 TV 还是手机????
    你确定你想清楚了么?
    apk 的基本要求就是自适应所有允许安装的安卓平台。
    为不同平台输出不同 apk,是一种开发流程上的简化,相对而言舍弃的就是用户需要针对平台安装不同版本的 apk 。
    coderluan
        7
    coderluan  
       2020-07-27 17:47:14 +08:00   ❤️ 1
    @SupperMary 用 apkanalyzer 分析下 apk 文件, 然后还是查看下官方文档的那些内容是哪种, 或者是兼容的.
    LLaMA2
        8
    LLaMA2  
       2020-07-27 17:55:38 +08:00   ❤️ 1
    一种是分应用,即手机和 TV 上的 App 有差异,以中是集成在一起,代码中根据设备形态决定显示何种 UI,实际上 TV 上的 App 无非就是不需要触控,适配遥控器的各种按键动作,你想一下,手机上可没有上一个频道下一个频道,但是 TV 上有,是不是该有对应的逻辑处理这个东西,就好比手机上你可能会处理一些手势,明白了吗?小老弟
    dying4death
        9
    dying4death  
       2020-07-27 18:29:13 +08:00   ❤️ 1
    我怎么觉得楼主说的是 ROM
    VDimos
        10
    VDimos  
       2020-07-27 18:29:50 +08:00 via Android   ❤️ 1
    @SupperMary 这不分仓库构建的吗
    SupperMary
        11
    SupperMary  
    OP
       2020-07-27 18:54:10 +08:00
    @dying4death 华生,你抓住了盲点。👍
    SupperMary
        12
    SupperMary  
    OP
       2020-07-27 18:55:57 +08:00
    @kop1989 可能问题里的描述有写误导性。我的意思是编译出来的 ROM 是 TV 还是手机哈
    SupperMary
        13
    SupperMary  
    OP
       2020-07-27 19:00:07 +08:00
    @ye4tar 老哥我的意思是编译出来的安卓系统是 TV 还是手机哈
    sunrain
        14
    sunrain  
       2020-07-29 10:09:08 +08:00
    ```
    <uses-feature android:name="android.hardware.type.television" android:required="true" />
    ```
    systemcall
        15
    systemcall  
       2020-07-31 14:26:15 +08:00 via Android
    见到不少国产安卓电视和盒子说自己是平板
    zhiyzellda
        16
    zhiyzellda  
       2020-07-31 19:10:47 +08:00 via Android
    @systemcall 因为对 AndroidTV 的源码进行魔改的难度很高吧。平板源码的魔改难度会低很多,包括删掉 Google 生态之类的。AndroidTV 源码想要无痛去掉 Google 生态的工作量可能非常大。
    SupperMary
        17
    SupperMary  
    OP
       2020-07-31 22:08:40 +08:00
    @zhiyzellda AOSP 里面的编译选项本身就没有安卓 TV 的编译选项。再加上链接

    https://developer.android.com/guide/topics/resources/providing-resources#UiModeQualifier
    里面提及的 “television:设备正在通过电视显示内容,通过将界面投影到离用户较远的大屏幕上,为用户提供“十英尺”体验。主要面向遥控交互或其他非触控式交互”。

    其实我自己是偏向于安卓会根据运行的硬件来决定自己到底是不是一个 TV 的。只是有关的资料没有找到。
    SupperMary
        18
    SupperMary  
    OP
       2021-10-09 12:51:39 +08:00
    @sunrain 正解,位置在 /system/etc/permission 或者 /syste/etc/sysconfig/ 下面的 xml 里面
    Modificator
        19
    Modificator  
       2022-04-20 16:19:20 +08:00
    <!-- Control the default UI mode type to use when there is no other type override
    happening. One of the following values (See Configuration.java):
    1 UI_MODE_TYPE_NORMAL
    4 UI_MODE_TYPE_TELEVISION
    5 UI_MODE_TYPE_APPLIANCE
    Any other values will have surprising consequences. -->
    <integer name="config_defaultUiModeType">4</integer>
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1544 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 17:01 · PVG 01:01 · LAX 10:01 · JFK 13:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.