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