最近使用了小米 CarWith 2.0 ,救活了我的老车机,作为 Android 开发者其中一些实现方案,让我有些困惑。
CarWith 可以将一些应用(哔哩哔哩、抖音等等)投屏至车机显示屏,并且在手机上并不会显示相应的,同时也不影响手机上打开其他 app 进行操作。
起初我认为这一功能是通过创建一个虚拟的 Display ,随后让指定应用在该虚拟 Display 中运行,再将图像数据传输到车机显示。随后我写了相关代码并签署 platforms 签名,进行测试。
创建 Display 的核心代码主要就两句:
DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
VirtualDisplay display = displayManager.createVirtualDisplay(
name, width, height, dpi, surface,
DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE |
DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED |
DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH |
/*DisplayManager. VIRTUAL_DISPLAY_FLAG_OWN_FOCUS*/ 1 << 14
);
在目标 Display 启动应用的核心代码:
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
ActivityOptions options = ActivityOptions.makeBasic()
.setLaunchDisplayId(display.getDisplayId());
options.setLaunchWindowingMode(6);
context.startActivity(intent, options.toBundle());
经过测试,即使在签署 platforms 签名,且具有 INTERNAL_SYSTEM_WINDOW 与 ACTIVITY_EMBEDDING 权限的情况下,仍然不能达到类似 CarWith 的效果,即应用仅在指定的 Display 显示,我这样运行后,主屏幕上也会显示运行的应用。
因此,请问各位大佬,类似的这种效果是通过什么技术方案实现的?