小米 CarWith 投屏的技术方案是如何实现的?

296 天前
 gam2046

最近使用了小米 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 显示,我这样运行后,主屏幕上也会显示运行的应用。


因此,请问各位大佬,类似的这种效果是通过什么技术方案实现的?

385 次点击
所在节点    小米
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/995860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX