为 Android 中的所有应用禁用分屏模式

Disable split screen mode for all apps in Android

我想要的: 禁止用户在他的 phone.

中对任何应用程序使用分屏模式

我已经做过的事情: 要禁用分屏模式,我需要检测调用了哪个方法,并且在该方法中我可以进一步添加功能以在其上绘制自定义视图或快速下拉分屏 window。 我也在研究 AccessibilityEvents,可能是我需要解析和过滤一些关键字才能进行分屏检测。

那么Android会告诉用户刚刚开始使用分屏模式的方法是什么。以及如何快速下拉分屏window?

如果您在注册辅助功能服务时询问了 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED 事件,则可以检测到任何应用程序何时进入分屏模式。

检测分屏模式的可能方法:

onAccessibilityEvent(AccessibilityEvent event)函数中我们需要编写event.getSource().getContentDescription();并在字符串中搜索"Split"或"Dismiss"或其他关键字,取决于各种自定义rom。每当应用程序进入分屏模式时,其内容描述设置为 'Split Whatsapp' 等。这就是我们如何检测任何特定应用程序何时进入分屏模式。

阻止任何应用程序使用分屏模式的可能方法:

检测后需要加上这一行,才能让用户无法使用分屏模式。它只会停靠当前应用程序 window。

performGlobalAction(AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN)

还有其他全局事件可以执行以下操作:

  1. GLOBAL_ACTION_BACK
  2. GLOBAL_ACTION_HOME
  3. GLOBAL_ACTION_LOCK_SCREEN
  4. GLOBAL_ACTION_NOTIFICATIONS
  5. GLOBAL_ACTION_POWER_DIALOG
  6. GLOBAL_ACTION_QUICK_SETTINGS
  7. GLOBAL_ACTION_RECENTS
  8. GLOBAL_ACTION_TAKE_SCREENSHOT

GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN

不过最适合这个场景的是:GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN

public class AppAccessibility extends AccessibilityService {

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        AccessibilityServiceInfo config = new AccessibilityServiceInfo();
        config.eventTypes = AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
        config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        if (Build.VERSION.SDK_INT >= 16) {
            config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
        }
        setServiceInfo(config);
    }
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event != null && event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
            if (event.getSource() != null && event.getSource().getContentDescription() != null) {
                if (event.getSource().getContentDescription().toString().contains("Split")) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        performGlobalAction(AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN));
                }
            }
        }
    }
}