Android 14 多用户下Display 显示问题

scrcpy 指定display id 才能看到,但是物理屏上看不到

如果此时将TYPE_APPLICATION_OVERLAY 改为TYPE_DISPLAY_OVERLAY 就能正常显示

原因如下

frameworks/base/services/core/java/com/android/server/wm/WindowState.java

    /** @return {@code true} if this window can be shown to all users. */
    boolean showForAllUsers() {

        // If this switch statement is modified, modify the comment in the declarations of
        // the type in {@link WindowManager.LayoutParams} as well.
        switch (mAttrs.type) {
            default:
                // These are the windows that by default are shown only to the user that created
                // them. If this needs to be overridden, set
                // {@link WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS} in
                // {@link WindowManager.LayoutParams}. Note that permission
                // {@link android.Manifest.permission.INTERNAL_SYSTEM_WINDOW} is required as well.
                if ((mAttrs.privateFlags & SYSTEM_FLAG_SHOW_FOR_ALL_USERS) == 0) {
                    return false;
                }
                break;

            // These are the windows that by default are shown to all users. However, to
            // protect against spoofing, check permissions below.
            case TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY:
            case TYPE_APPLICATION_STARTING:
            case TYPE_BOOT_PROGRESS:
            case TYPE_DISPLAY_OVERLAY:
            case TYPE_INPUT_CONSUMER:
            case TYPE_KEYGUARD_DIALOG:
            case TYPE_MAGNIFICATION_OVERLAY:
            case TYPE_NAVIGATION_BAR:
            case TYPE_NAVIGATION_BAR_PANEL:
            case TYPE_PHONE:
            case TYPE_POINTER:
            case TYPE_PRIORITY_PHONE:
            case TYPE_SEARCH_BAR:
            case TYPE_STATUS_BAR:
            case TYPE_NOTIFICATION_SHADE:
            case TYPE_STATUS_BAR_ADDITIONAL:
            case TYPE_STATUS_BAR_SUB_PANEL:
            case TYPE_SYSTEM_DIALOG:
            case TYPE_VOLUME_OVERLAY:
            case TYPE_PRESENTATION:
            case TYPE_PRIVATE_PRESENTATION:
            case TYPE_DOCK_DIVIDER:
                break;
        }

        // Only the system can show free windows to all users.
        return mOwnerCanAddInternalSystemWindow;

    }

TYPE_DISPLAY_OVERLAY 默认是对所有User 可见,如果希望自己的Display 也可以显示,两种方法,一种改为上面可以多用户显示的type 类型即可,或者添加SYSTEM_FLAG_SHOW_FOR_ALL_USERS 这个Flag

Android 11 系统中,DPI 的设置是与 Display Metrics 相关的,因此需要在系统源码中进行设置。 以下是在 Android 11 源码中设置 DPI 的大致流程: 1. 在系统启动时,会读取 `/system/build.prop` 文件中的 `ro.sf.lcd_density` 属性值,并将其转换为 Display Metrics 中的 densityDpi 值。 2. 在 `frameworks/base/core/java/android/view/DisplayInfo.java` 文件中,定义了 Display Metrics 的各项属性值,包括 densityDpi。 3. 在 `frameworks/base/core/java/android/hardware/display/DisplayManagerGlobal.java` 文件中,定义了获取 Display Info 的方法 `getDisplayInfo(displayId, outDisplayInfo)`,其中 outDisplayInfo 包含了 Display Metrics 的各项属性值。 4. 在 `frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java` 文件中,定义了设置 Display Metrics 的方法 `setInitialDisplaySize(displayId, width, height, densityDpi)`,这个方法会将 Display Metrics 的各项属性值写入到系统属性中。 5. 在 `frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java` 文件中,定义了读取系统属性的方法 `getInitialDisplayDensity(displayId)`,这个方法会从系统属性中读取 densityDpi 值,并将其返回。 6. 在 `frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java` 文件中,定义了获取 Display Info 的方法 `getDisplayInfo(displayId)`,这个方法会调用 `getDisplayInfo(displayId, outDisplayInfo)` 方法,并将 outDisplayInfo 中的 Display Metrics 信息返回。 通过以上流程,就可以在 Android 11 系统中设置 DPI 值,并在运行时获取到 DPI 值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值