Android主副屏显示-Android13

news2024/11/17 5:23:15

Android主副屏显示-Android13

  • 1、DisplayDeviceInfo屏幕信息
  • 2、LogicalDisplay.java
    • 2.1 configureDisplayLocked刷新

DisplayManagerService启动及主屏添加-Android13

1、DisplayDeviceInfo屏幕信息

DisplayManagerService启动及主屏添加-Android13 中监听获取,在LocalDisplayAdapter.java#tryConnectDisplayLocked 获取 DisplayDevice 信息,在DisplayDeviceRepository.java#handleDisplayDeviceAdded 获取 DisplayDeviceInfo ( 即 DisplayDevice.getDisplayDeviceInfoLocked()

命令查看屏幕信息:

$ dumpsys SurfaceFlinger --display-id
# Example output.
Display 21691504607621632 (HWC display 0): port=0 pnpId=SHP displayName="LQ123P1JX32"
Display 9834494747159041 (HWC display 2): port=1 pnpId=HWP displayName="HP Z24i"
Display 1886279400700944 (HWC display 1): port=2 pnpId=AUS displayName="ASUS MB16AP"
  • mInfo.width = mActiveSfDisplayMode.width:屏幕宽
  • mInfo.height = mActiveSfDisplayMode.height:屏幕高
  • mInfo.densityDpi = getLogicalDensity():屏幕Density
  • mInfo.xDpi = mActiveSfDisplayMode.xDpi:显示器在X方向上的DPI物理密度
  • mInfo.yDpi = mActiveSfDisplayMode.yDpi:显示器在Y方向上的DPI物理密度。
  • mInfo.installOrientation = mStaticDisplayInfo.installOrientation:显示面板的安装方向相对于其自然方向。
  • mInfo.type = Display.TYPE_INTERNAL 或 Display.TYPE_EXTERNAL :内置屏幕<string name="display_manager_built_in_display_name">Built-in Screen</string>、HDMI 屏幕<string name="display_manager_hdmi_display_name">HDMI Screen</string>
  • public int rotation = Surface.ROTATION_0:显示旋转方向
public DisplayDeviceInfo getDisplayDeviceInfoLocked() {
    if (mInfo == null) {
        mInfo = new DisplayDeviceInfo();
        mInfo.width = mActiveSfDisplayMode.width;
        mInfo.height = mActiveSfDisplayMode.height;
        mInfo.modeId = mActiveModeId;
        mInfo.defaultModeId = getPreferredModeId();
        mInfo.supportedModes = getDisplayModes(mSupportedModes);
        mInfo.colorMode = mActiveColorMode;
        mInfo.allmSupported = mAllmSupported;
        mInfo.gameContentTypeSupported = mGameContentTypeSupported;
        mInfo.supportedColorModes =
                new int[mSupportedColorModes.size()];
        for (int i = 0; i < mSupportedColorModes.size(); i++) {
            mInfo.supportedColorModes[i] = mSupportedColorModes.get(i);
        }
        mInfo.hdrCapabilities = mHdrCapabilities;
        mInfo.appVsyncOffsetNanos = mActiveSfDisplayMode.appVsyncOffsetNanos;
        mInfo.presentationDeadlineNanos = mActiveSfDisplayMode.presentationDeadlineNanos;
        mInfo.state = mState;
        mInfo.uniqueId = getUniqueId();
        final DisplayAddress.Physical physicalAddress =
                DisplayAddress.fromPhysicalDisplayId(mPhysicalDisplayId);
        mInfo.address = physicalAddress;
        mInfo.densityDpi = getLogicalDensity();
        mInfo.xDpi = mActiveSfDisplayMode.xDpi;
        mInfo.yDpi = mActiveSfDisplayMode.yDpi;
        mInfo.deviceProductInfo = mStaticDisplayInfo.deviceProductInfo;

        // Assume that all built-in displays that have secure output (eg. HDCP) also
        // support compositing from gralloc protected buffers.
        if (mStaticDisplayInfo.secure) {
            mInfo.flags = DisplayDeviceInfo.FLAG_SECURE
                    | DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS;
        }

        final Resources res = getOverlayContext().getResources();

        mInfo.flags |= DisplayDeviceInfo.FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY;

        if (mIsFirstDisplay) {
            if (res.getBoolean(com.android.internal.R.bool.config_mainBuiltInDisplayIsRound)
                    || (Build.IS_EMULATOR
                    && SystemProperties.getBoolean(PROPERTY_EMULATOR_CIRCULAR, false))) {
                mInfo.flags |= DisplayDeviceInfo.FLAG_ROUND;
            }
        } else {
            if (!res.getBoolean(
                        com.android.internal.R.bool.config_localDisplaysMirrorContent)) {
                mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY;
            }

            if (isDisplayPrivate(physicalAddress)) {
                mInfo.flags |= DisplayDeviceInfo.FLAG_PRIVATE;
            }
        }

        if (DisplayCutout.getMaskBuiltInDisplayCutout(res, mInfo.uniqueId)) {
            mInfo.flags |= DisplayDeviceInfo.FLAG_MASK_DISPLAY_CUTOUT;
        }

        final Display.Mode maxDisplayMode =
                DisplayUtils.getMaximumResolutionDisplayMode(mInfo.supportedModes);
        final int maxWidth =
                maxDisplayMode == null ? mInfo.width : maxDisplayMode.getPhysicalWidth();
        final int maxHeight =
                maxDisplayMode == null ? mInfo.height : maxDisplayMode.getPhysicalHeight();
        mInfo.displayCutout = DisplayCutout.fromResourcesRectApproximation(res,
                mInfo.uniqueId, maxWidth, maxHeight, mInfo.width, mInfo.height);

        mInfo.roundedCorners = RoundedCorners.fromResources(
                res, mInfo.uniqueId, maxWidth, maxHeight, mInfo.width, mInfo.height);
        mInfo.installOrientation = mStaticDisplayInfo.installOrientation;

        if (mStaticDisplayInfo.isInternal) {
            mInfo.type = Display.TYPE_INTERNAL;
            mInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL;
            mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
            mInfo.name = res.getString(
                    com.android.internal.R.string.display_manager_built_in_display_name);
        } else {
            mInfo.type = Display.TYPE_EXTERNAL;
            mInfo.touch = DisplayDeviceInfo.TOUCH_EXTERNAL;
            mInfo.flags |= DisplayDeviceInfo.FLAG_PRESENTATION;
            mInfo.name = getContext().getResources().getString(
                    com.android.internal.R.string.display_manager_hdmi_display_name);
        }
        mInfo.frameRateOverrides = mFrameRateOverrides;

        // The display is trusted since it is created by system.
        mInfo.flags |= DisplayDeviceInfo.FLAG_TRUSTED;
        mInfo.brightnessMinimum = PowerManager.BRIGHTNESS_MIN;
        mInfo.brightnessMaximum = PowerManager.BRIGHTNESS_MAX;
        mInfo.brightnessDefault = getDisplayDeviceConfig().getBrightnessDefault();
    }
    return mInfo;
}

在这里插入图片描述

2、LogicalDisplay.java

frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
frameworks/base/services/core/java/com/android/server/display/LogicalDisplay.java

RootWindowContainer.java#onDisplayAdded

DisplayContent.java#updateDisplayAndOrientation

DisplayManagerService.java#setDisplayInfoOverrideFromWindowManager

LogicalDisplay.java#setDisplayInfoOverrideFromWindowManagerLocked

2.1 configureDisplayLocked刷新

RootWindowContainer.java#applySurfaceChangesTransaction

DisplayManagerService.java#performTraversalLocked

DisplayManagerService.java#configureDisplayLocked

LogicalDisplay.java#configureDisplayLocked

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3+ElementPlus 封装图片空间组件的门面

什么是图片空间? 图片空间就是专门管理我们上传图片的地方。就好比用户管理一样&#xff0c;我们对要上传的图片进行管理。 这样做的好处有哪些&#xff1f; 我们把可能需要的图片都上传到图片管理中。在其他需要图片的地方&#xff08;如&#xff1a;商品图片等&#xff09;可…

【MATLAB】FIR滤波器的MATLAB实现

FIR滤波器的MATLAB实现 FIR滤波器的设计fir1函数fir2函数 与IIR滤波器相比&#xff0c;FIR滤波器既有其优势也有其局限性。FIR滤波器的主要优点包括&#xff1a; 精确的线性相位响应&#xff1b;永远保持稳定性&#xff1b;设计方法通常是线性的&#xff1b;在硬件实现中具有更…

Open CASCADE学习|按圆离散旋转体

旋转体是一个非常重要的概念&#xff0c;它涉及到三维空间中由二维曲线绕某一轴线旋转形成的立体形状。这种旋转体的形成过程&#xff0c;实际上是一个连续变化的动态过程&#xff0c;但在数学和几何学中&#xff0c;我们往往通过静态的方式来描述和研究它。 旋转体的基本特性…

中电金信智能视觉分析系统,以AI技术助力企业升级

基于行业需求与业务痛点&#xff0c;中电金信推出了智能视觉分析系统。该系统是集视频接入、视频识别与分析、AI算法管理、异常报警等为一体&#xff0c;可提供视频安全监管标准的场景应用方案以及二次开发能力的通用智能视觉分析系统。该系统拥有强大的监控摄像头设备接入能力…

EFI引导模式下配置Windows和Linux双系统共存

这几天在VirtualBox虚机里玩Modular MAX下的LLama3大模型&#xff0c;实在受不了这执行速度&#xff0c;于是下决心把Ubuntu系统安装在硬盘上跟Windows11做双系统共存。之前在传统BIOS引导模式下做过不少次双系统引导&#xff0c;EFI模式下第一次做&#xff0c;加之windows系统…

【JavaSE】--数据类型与变量

文章目录 1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 整型变量3.2.1 整型变量3.2.2 长整型变量3.2.3 短整型变量3.2.4 字节型变量 3.3 浮点型变量3.3.1 双精度浮点型3.3.2 单精度浮点型 3.4 字符型变量3.5 布尔型变量3.6 类型转换3.6.1 自动类型转换&#xff08;隐式&#…

Openeuler22 部署 RackTables0.22.0

目录 0、前言 一、部署lamp环境&#xff0c;lamp环境测试 1、部署Apache&#xff0c;apache环境测试 2、部署php、mysql&#xff0c;php环境测试 二、放文件 三、配置mysql 四、安装racktables 第一步、点击proceed继续 第二步、点击proceed 第三步、根据提示进行操作…

【Qt】解决设置QPlainTextEdit控件的Tab为4个空格

前言 PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合&#xff0c;它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序&#xff0c;以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。…

【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打伯爵-电池:伏打电池

前言&#xff1a;用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注&#xff0c;你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢&#xff1f; 首先肯定是因为我本身就是一名从业通信者&#xff0c;想着更加了解自己…

RHEL 7 安装配置( Linux 网络操作系统 02)

一、虚拟机安装 我们的每台电脑都已经安装了VMware 虚拟机&#xff0c;其安装相当简单&#xff0c;在此不再赘述。可以参考如下链接&#xff1a; VMWare安装傻瓜式教程 &#xff08;大家可以关注老师的博客&#xff0c;也建议大家写博客。&#xff09; 二、红帽 rhel 7 安装 找…

Windows系统Docker部署AList并挂载阿里云盘实现远程访问详细教程——“cpolar内网穿透”

文章目录 前言1. 使用Docker本地部署Alist1.1 本地部署 Alist1.2 访问并设置Alist1.3 在管理界面添加存储 2. 安装cpolar内网穿透3. 固定Alist公网地址 前言 本文和大家分享如何在Windows系统使用Docker本地部署Alist全平台网盘神器&#xff0c;然后结合cpolar内网穿透工具实现…

运维Tips | 如何安全的移除系统中旧的Linux内核?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 如何安全的删除系统中旧的 Linux 内核? 描述&#xff1a;如果更新了 Linux 操作系统&#xff0c;那么你会注意到&#xff0c;每次升级 Linux 内核后&#xff0c;GRUB 菜单都会添加一个新的引导条…

如何解决 Windows PowerShell 中 “无法加载文件 pnpm.ps1” 的错误

当你在 Windows 系统上尝试使用 pnpm 时&#xff0c;如果遇到“无法加载文件 pnpm.ps1”的错误&#xff0c;通常这意味着 PowerShell 的执行策略阻止了脚本的运行。这种限制是为了防止未经授权的脚本在您的计算机上执行&#xff0c;但它同样也会阻止合法但未签名的脚本运行。 …

解读:靠卖石头能否实现财务自由?

在生活中&#xff0c;我们常常听闻各种独特的创业故事&#xff0c;而 “卖石头实现月入过万” 也成为了一个令人好奇的话题。 在大家生活压力都比较大的情况下&#xff0c;许多人都在寻找新的收入来源&#xff0c;尤其是在经济压力日益增加的情况下。最近&#xff0c;一些人开…

如何选择可靠的相亲交友平台:安全与诚信并重

在数字化时代&#xff0c;相亲交友系统已成为寻找伴侣的重要途径。然而&#xff0c;选择一个可靠的平台对于确保安全和诚信至关重要。以下是如何选择可靠相亲交友平台的指南 &#xff1a; 第一章&#xff1a;安全为先 选择相亲交友系统时&#xff0c;安全性是首要考虑的因素。…

读书记录:谷歌工作法 工作效率提升10倍的57个技巧

​ 前言 我在谷歌工作时留下的最深刻印象是“必须以全世界最快的速度取得成果”这一谷歌特有的强烈的使命感。 为什么日本的企业生产效率低下 过度推迟讨论 过分讨论 过度的交流 改变工作方式方法才是生存之道 在这样的时代&#xff0c;我们不应该害怕“自己的工作消失”&a…

【CSS in Depth 2 精译_027】4.4 Flexbox 元素对齐、间距等细节处理(下)+ 4.5 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

[MySQL表的增删改查-进阶]

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f4bb…

【拥抱AI】主流平台AI Agent使用体验对比

为了更好的了解和学习RAG的原理和实战效果&#xff0c;也因为工作需要&#xff0c;这两天都奔波在各大主流AI平台。 以下自己收集的是一些主流大模型LLM的AI Agent对比&#xff0c;通过功能特性、易用性与集成性、成本与商业模式、安全性与隐私性几个方面来了解&#xff0c;有不…

LSP协议:打造流动性管理的市场新标杆

随着以太坊从 PoW&#xff08;工作量证明&#xff09;向 PoS&#xff08;权益证明&#xff09;的转型&#xff0c;PoS已然成为主流区块链共识机制的重要组成部分。再加上跨链技术的发展&#xff0c;包含比特币在内的不同生态之间进行资产质押与交换也催生出市场对于流动性管理的…