LockTask模式下误按返回键后,如何回到InCallUI?
针对LockTask模式下COSU应用通话挂断问题的解决方案
嘿,这个场景我在做企业COSU项目时刚好遇到过,结合你不能退出LockTask模式的需求,给你几个可行的方案:
一、唤起InCallUI的系统Intent
确实有专门的系统Intent可以直接唤起通话界面,让用户操作挂断或键盘。你可以在浮层按钮的点击事件里触发这个Intent:
// Kotlin 示例 val inCallIntent = Intent("android.intent.action.SHOW_IN_CALL_UI") inCallIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(inCallIntent)
或者Java写法:
// Java 示例 Intent inCallIntent = new Intent("android.intent.action.SHOW_IN_CALL_UI"); inCallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(inCallIntent);
需要注意两点:
- 你的应用需要申请
READ_PHONE_STATE或CALL_PHONE权限,并在AndroidManifest.xml中声明; - 确保你的应用和电话应用都在LockTask白名单内,否则Intent可能无法正常启动。
二、从根源解决返回键误按问题
既然核心痛点是员工误按返回键导致无法回到通话界面,你可以通过设备政策管理器(DevicePolicyManager)在LockTask模式下禁用导航栏的返回键:
val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val adminComponent = ComponentName(this, YourDeviceAdminReceiver::class.java) // 禁用LockTask模式下所有导航键(返回、主页、多任务) dpm.setLockTaskFeatures(adminComponent, DevicePolicyManager.LOCK_TASK_FEATURE_NONE)
这样设置后,即使切换到白名单内的电话应用,导航栏也会保持禁用状态,从根本上避免误按返回键的情况。
三、浮层按钮的实现要点
如果你想用顶部栏或悬浮按钮触发Intent,需要注意:
- 申请
SYSTEM_ALERT_WINDOW权限,Android 6.0及以上版本还需要引导用户手动授权该权限; - 因为处于LockTask模式,只有设备所有者应用或系统应用才能显示悬浮窗,所以你的COSU主应用必须是设备所有者应用,否则悬浮窗会被系统拦截。
内容的提问来源于stack exchange,提问作者Doc_1faux
相关产品推荐
相关产品推荐

