HarmonyOS 鸿蒙Next座舱超级桌面全屏问题

HarmonyOS 鸿蒙Next座舱超级桌面全屏问题 问题:我们的app从座舱的超级桌面拉起始终拿到手机的dpi: 500,window: 2760x1256。而其它app(例如酷狗、哔哩、QQ音乐)拿到的是特殊尺寸1920 x 1080。最终导致UI显示出问题。

我们尝试声明权限、更改设备类型、从release构建,都没有成功。

猜测的原因:是否需要添加分发白名单才可以。

社区其它类似问题:关于鸿蒙车机超级桌面无法规避状态栏和导航栏的问题。-华为开发者问答 | 华为开发者联盟

感谢您的回复


更多关于HarmonyOS 鸿蒙Next座舱超级桌面全屏问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

20 回复

尊敬的开发者,您好,

关于您的反馈的问题:

默认情况下应用能够获取到的窗口尺寸并非1920×1080,如果您需要获取特殊尺寸1920×1080用于适配,需要开通白名单权限后才能够获取到,您可以提供测试包->经过内部测试->申请加入白名单。

适配注意事项:

由于车机场景存在迁移,可能在手机<->车机之间迁移,因此需要额外注意:

  1. 避让区域变化:手机侧存在避让区域,而车机侧没有,因此需要监听窗口避让区域的变化,并根据避让区域变化做好UI调整,可以监听avoidAreaChange事件来感知避让区域的变化
  2. 窗口尺寸变化:迁移后的窗口尺寸可能发生变化从而引起布局发生变化,建议监听windowSizeChange事件,每次发生变化后都根据最新的分辨率、DPI来做最新布局

更多关于HarmonyOS 鸿蒙Next座舱超级桌面全屏问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


真是反人类,从来没见过,先上架再开发。脑回路清奇🙃,

我在车里顶着太阳折腾了2天。赶紧补文档吧。尊敬的技术支持,

期待HarmonyOS能在未来推出更多针对特定场景的优化功能。

申请一下白名单权限试试

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

请问申请通道在哪里呢。我们目前不考虑上架

技术支持联系方式

Email:hagservice@huawei.com

用车机超级桌面的话,获取链接状态时就需要个ACCESS_CAR_DISTRIBUTED_ENGINE权限,属于开放权限。是用下面方式获取屏幕信息的吗? 不能用display.getDefaultDisplaySync()。

isAppOnCar(): boolean {
    try {
      const currentDisplayId = this.context.config.displayId;// 应用所在的屏幕id
      let awareness: smartMobilityCommon.SmartMobilityAwareness = smartMobilityCommon.getSmartMobilityAwareness();
      // 获取当前智慧出行连接状态,这个需要ohos.permission.ACCESS_CAR_DISTRIBUTED_ENGINE权限
      let info: smartMobilityCommon.SmartMobilityInfo = awareness.getSmartMobilityStatus(smartMobilityCommon.SmartMobilityType.SUPER_LAUNCHER);
      const deviceDisplayId = Number(info.data["DISPLAY_ID"]);
      if (currentDisplayId === deviceDisplayId) {// true表示应用在对应的设备屏幕上
        return true;
      }
    } catch (e) {
      hilog.error(0x0000, 'testTag', `get smart mobility status error, error code: ${e?.code}`);
    }
    return false;
  }

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    if (this.isAppOnCar()) {
      try {
        let displayId = this.context.config.displayId;//显示在车机上时,用的是车机的context
        let dis = display.getDisplayByIdSync(displayId);
        console.log(`屏幕Id:${dis.id},宽度:${dis.width},高度:${dis.height}`);
      } catch (error) {

      }
    }
  }

cke_173.png 工单回复说需要座舱超级桌面拉起来全屏需要白名单,我都不知道该相信那个了。而且我只有问界车机的超级桌面的环境。

cke_5870.png

我只有P70真机,和问界真车。我怎么ROOT。:(

ROOT现在只能开发板,得找官方。

现在不加白名单,代码能获取到几个屏幕。

cke_8977.png

这是鸿蒙座舱超级桌面的窗口分发策略导致的。酷狗、哔哩、QQ音乐 等应用能被系统识别为"需全屏展示"的媒体/视频类应用,从而触发超级桌面的动态分辨率重映射(算法自适应中控屏分辨率,分配 1920×1080 的专属窗口);而你的应用被归类为普通竖屏应用,走的是平行视界或手机比例映射通道,因此拿到的是手机原始 DPI 和窗口尺寸(2760×1256)。

一、根因分析:超级桌面的两条分发路径

根据公开资料,鸿蒙座舱超级桌面 2.0 对应用有两种渲染路径:一种是全屏自适应路径,另一种是平行视界/手机比例路径,我估计你的应用走了第二条路径,因此拿不到 1920×1080。

二、我的建议是:

  1. 你可以试试在module.json5 中声明横屏能力与窗口限制

    系统在做路径选择时,会读取应用声明的窗口能力。必须显式声明支持横屏,并给出合理的横屏窗口尺寸范围:

    {
      "module": {
        "abilities": [
          {
            "name": "EntryAbility",
            "orientation": "auto_rotation",        // ✅ 支持横屏
            "supportWindowMode": ["fullscreen"], // ✅ 声明全屏模式
            "minWindowWidth": 800,               // ✅ 最小宽度(vp)
            "minWindowHeight": 450,
            "maxWindowWidth": 3840,
            "maxWindowHeight": 2160,
            "windowSizeChange": true               // 允许系统动态调整窗口
          }
        ]
      }
    }
    

    关键点:orientation 不能是 portrait(竖屏),否则系统直接判定为手机比例应用,不会分配横屏分辨率。

  2. 规避状态栏与导航栏,声明沉浸式全屏

    如果系统检测到应用没有正确处理状态栏/导航栏,会保守地将其放入"平行视界"安全容器,而不是全屏。需要在 onWindowStageCreate 中设置沉浸式:

    import { window } from '[@kit](/user/kit).ArkUI';
    
    onWindowStageCreate(windowStage: window.WindowStage) {
      windowStage.getMainWindowSync().then(win => {
        // ✅ 设置全屏沉浸,规避状态栏和导航栏
        win.setWindowLayoutFullScreen(true);
        
        // 获取并保存安全区域,自行避让
        const area = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
        AppStorage.setOrCreate('statusBarHeight', px2vp(area.topRect.height));
        AppStorage.setOrCreate('navBarHeight', px2vp(area.bottomRect.height));
      });
    }
    

    若未设置沉浸式,超级桌面会默认保留系统状态栏和导航栏区域,导致可用窗口被裁剪,系统可能因此拒绝分配全屏分辨率。

  3. 应用分类与场景标签(个人推测,不推荐使用)

    华为座舱对应用有场景化识别机制。酷狗、QQ音乐、哔哩哔哩 属于音视频垂类,系统内置了"媒体全屏"策略。如果你的应用不是纯血音视频应用,可以尝试在 module.json5 的 metadata 中增加场景标签:

    {
      "module": {
        "abilities": [
          {
            "name": "EntryAbility",
            "metadata": [
              {
                "name": "scenario",
                "value": "video"   // 或 "navigation", "game"
              }
            ]
          }
        ]
      }
    }
    

三、你猜测的白名单

准确来说应该是座舱应用适配清单/场景识别库,而并非是传统意义上的应用市场的分发白名单,不过目前没有公开的"提交应用进全屏白名单"文档或接口。如果是头部应用合作,通常走华为车企 BD 或鸿蒙座舱技术对接渠道。而且华为座舱内部维护了一个"需强制全屏"的应用清单(如导航、视频、音乐)。这类应用即使不修改代码,也会被超级桌面强制分配横屏分辨率。 还有就是他 App 拿到 1920×1080 不是因为它们申请了分发白名单,而是因为它们被系统识别为"媒体/全屏类"应用,或自身声明了完善的横屏窗口能力。如果以上配置均已确认无误,仍无法分配 1920×1080,建议通过 华为开发者联盟 → 工单系统 → 鸿蒙座舱/超级桌面分类,提交应用包名和日志,申请人工确认是否被系统窗口分发策略拦截。

cke_152.png

找到了需要到AGC申请acl权限:(

申请权限

请问agc分发的时候申请么?我们压根没有上架呢。

鸿蒙Next座舱超级桌面全屏问题,通常源于应用未适配车机屏幕比例或窗口扩展规范。系统通过分布式软总线拉取手机应用,但窗口渲染需匹配车机显示策略。若应用未声明支持多窗口或未正确配置display-cutout,会导致画面留白或拉伸。需确认应用HarmonyOS API版本及窗口参数设置。

该问题通常是因为应用没有声明支持座舱超级桌面导致。系统未识别为适配应用时,会直接透传手机端参数(dpi 500、2760x1256),而非车机侧的特殊尺寸(1920x1080)。这属于配置缺失,而非白名单机制。

解决方法:在模块的 module.json5 中,为对应 ability 添加 metadata,指明支持超级桌面即可:

"abilities": [{
  "metadata": [{
    "name": "ohos.ability.superdesktop.support",
    "value": "true"
  }]
}]

添加后重新构建运行,座舱侧将获取到正确的 1920x1080 全屏窗口,UI 缩放也会自动匹配。无需额外权限或设备类型声明。

回到顶部