You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android无障碍服务:GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN替代方案及分屏程序化实现

程序化启用Android分屏模式的替代方案(GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN失效时)

核心思路

当系统全局操作GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN失效后,可通过以下两种方向实现程序化分屏:

  • 利用无障碍服务模拟用户手动触发分屏的操作流程(兼容性最好,适配多数版本)
  • 调用系统隐藏API(需注意版本限制和权限问题,风险较高)

方案一:无障碍服务模拟用户操作

通过模拟长按最近任务键、点击分屏按钮的手动流程实现,适配绝大多数Android版本,核心代码如下:

无障碍服务核心代码

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
        // 判断当前是否为需要触发分屏的目标页面
        if ("com.your.target.package".equals(event.getPackageName())) {
            // 触发最近任务界面
            performGlobalAction(GLOBAL_ACTION_RECENTS);
            
            // 延迟等待界面加载,时间可根据设备性能调整
            new Handler(Looper.getMainLooper()).postDelayed(() -> {
                AccessibilityNodeInfo rootNode = getRootInActiveWindow();
                if (rootNode == null) return;

                // 查找分屏按钮节点(优先匹配文本,再匹配内容描述)
                List<AccessibilityNodeInfo> splitNodes = rootNode.findAccessibilityNodeInfosByText("分屏");
                if (splitNodes.isEmpty()) {
                    splitNodes = rootNode.findAccessibilityNodeInfosByContentDescription("分屏");
                }

                if (!splitNodes.isEmpty()) {
                    AccessibilityNodeInfo splitBtn = splitNodes.get(0);
                    if (splitBtn.isEnabled() && splitBtn.isClickable()) {
                        splitBtn.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    }
                    splitBtn.recycle();
                }
                rootNode.recycle();
            }, 1000);
        }
    }
}

注意事项

  • 不同厂商的最近任务界面控件文本/描述可能存在差异,需针对主流品牌做适配
  • 延迟时间需根据设备性能调整,避免界面未加载完成就执行点击操作
  • 必须确保应用已开启无障碍权限,且用户授权了服务权限

方案二:调用系统隐藏API(Android 12+)

通过反射调用未公开的ActivityOptions或ActivityManager方法实现,仅适用于特定版本,且存在被系统禁用的风险:

反射启动分屏Activity

// 目标Intent
Intent targetIntent = new Intent(this, YourTargetActivity.class);

try {
    // 调用makeSplitScreenOptions创建分屏启动参数
    Method splitOptionMethod = ActivityOptions.class.getMethod("makeSplitScreenOptions", int.class);
    ActivityOptions options = (ActivityOptions) splitOptionMethod.invoke(null, 0);
    
    // 启动分屏Activity
    startActivity(targetIntent, options.toBundle());
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
    e.printStackTrace();
}

注意事项

  • 该API为系统隐藏接口,后续Android版本可能移除或限制调用
  • 部分厂商可能对该接口做了权限限制,普通应用可能无法调用成功

内容的提问来源于stack exchange,提问作者Akash Savaliya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:24:56