Android P系统支持虚拟屏显示,在虚拟屏中显示应用的画面。
但是相应的,在虚拟屏中去显示应用画面涉及到跨进程和权限的问题。
参考资料:https://source.android.com/devices/tech/display/multi_display/activity-launch
1·将页面现在在虚拟屏中的方法
Activity 启动行为由应用 AndroidManifest.xml 文件中的启动模式、Intent 标志以及调用方提供的 ActivityOptions 定义。使用 ActivityOption#setLaunchDisplayId(int) 可将特定屏幕指定为 Activity 启动的目标。
需要注意的是:用于启动 Activity 的 Intent 可解析为系统中已有的 Activity 实例。在这种情况下,如果未提供其他标志,Activity 会显示在最后一次使用它时所在的屏幕上。如果使用 ActivityOptions#setTargetDisplayId() 指定目标屏幕,Activity 会移动到该屏幕(如果安全限制及其他限制允许的话)。
2.权限限制
在 Android 10 中,为了防止恶意应用通过从其创建的虚拟屏幕的表面读取用户敏感信息来盗用相关信息,应用只能在其创建的虚拟屏幕上启动其自己的 Activity。
在虚拟屏中,如果启动的界面就是创建虚拟屏软件的app,就不存在权限问题。
但是如果想要把别人的app或者界面现在你自己创建的虚拟屏中,则存在去读用户敏感信息等隐私问题,需要用户授权。
启动方(画面提供者)权限:
1.INTERNAL_SYSTEM_WINDOW,具有 INTERNAL_SYSTEM_WINDOW 权限的系统组件可以在任何屏幕上启动。
2.ActivityInfo.FLAG_ALLOW_EMBEDDED,只有具备FLAG_ALLOW_EMBEDDED标识的Activity才能允许被启动。
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
在AndroidManifest.xml给Activity添加标识:
android:allowEmbedded="true"
调用方权限:
1.具有 ACTIVITY_EMBEDDING 权限的调用方可以从具有 ActivityInfo.FLAG_ALLOW_EMBEDDED 标志的其他应用启动 Activity。
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACTIVITY_EMBEDDING" />
Android Q和Android P的区别:
Android 10 包含 ActivityManager#isActivityStartAllowedOnDisplay(Context context, int displayId, Intent intent) 方法,用于先检查应用的安全限制,然后再尝试在屏幕上启动。在 Android 9(及更低版本)中,如果启动受到限制,系统会抛出 SecurityException。
注意:
android.permission.ACTIVITY_EMBEDDING只授权于系统应用和组件的权限,需要LOCAL_CERTIFICATE := platform和LOCAL_PRIVILEGED_MODULE := true权限。