如何在Galaxy Fold展开状态下启用外屏并在副屏启动Activity?
解决方案
1. 修正副屏获取逻辑
你当前直接调用getDisplay(0)的写法是错误的,默认Display ID为0的设备是主屏,正确的副屏遍历逻辑如下:
val displayManager = getSystemService(DISPLAY_SERVICE) as DisplayManager // 过滤所有可用副屏 val secondaryDisplays = displayManager.displays.filter { it.type == Display.TYPE_EXTERNAL || it.type == Display.TYPE_OVERLAY // 部分厂商折叠屏副屏会标记为TYPE_PRIVATE,可根据实际测试结果添加过滤条件 } if (secondaryDisplays.isEmpty()) { // 无可用副屏,提前拦截异常 return } val targetDisplay = secondaryDisplays.first()
2. 提前配置权限与清单属性
- 清单文件声明基础权限:
<!-- 唤醒屏幕权限 --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 安卓12+ 副屏启动Activity权限 --> <uses-permission android:name="android.permission.ACTIVATE_ON_SECONDARY_DISPLAYS" /> <!-- 锁屏场景展示权限 --> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- 给需要在外屏启动的
SecondActivity添加多屏适配配置:
<activity android:name=".SecondActivity" android:resizeableActivity="true" android:showWhenLocked="true" android:turnScreenOn="true" android:launchMode="singleInstance" />
- 注意:目前绝大多数折叠屏设备厂商都对第三方应用限制了副屏调用权限,需要引导用户手动在系统设置中开启应用的「在外屏显示」权限,部分厂商还需要在对应开放平台申请官方权限才能调用副屏能力。
3. 修正启动Activity逻辑
val options = ActivityOptions.makeBasic() options.launchDisplayId = targetDisplay.displayId val intent = Intent(this, SecondActivity::class.java).apply { // 添加必要启动Flag addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) // 唤醒屏幕相关Flag addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.toInt()) addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON.toInt()) addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON.toInt()) } startActivity(intent, options.toBundle())
4. Presentation方案适配
如果要使用Presentation实现副屏输出,需要使用副屏专属Context创建实例,同时配置窗口属性:
// 基于副屏创建专属Context val displayContext = createDisplayContext(targetDisplay) val presentation = Presentation(displayContext, targetDisplay) presentation.window?.apply { setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN) } presentation.setContentView(R.layout.your_cover_screen_layout) presentation.show()
内容的提问来源于stack exchange,提问作者kordek21
相关产品推荐
相关产品推荐

