Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检查屏幕是否处于无活动的多窗口模式_Android_Android 7.0 Nougat_Split Screen - Fatal编程技术网

Android 检查屏幕是否处于无活动的多窗口模式

Android 检查屏幕是否处于无活动的多窗口模式,android,android-7.0-nougat,split-screen,Android,Android 7.0 Nougat,Split Screen,如果我无法访问活动,是否有办法确定屏幕是否被分割?(从结构上讲,我不能调用isInMultiWindowMode方法 我看到默认的活动#isInMultiWindowMode()实现是: public boolean isInMultiWindowMode() { try { return ActivityManagerNative.getDefault().isInMultiWindowMode(mToken); } catch (RemoteException

如果我无法访问
活动
,是否有办法确定屏幕是否被分割?(从结构上讲,我不能调用
isInMultiWindowMode
方法

我看到默认的
活动#isInMultiWindowMode()
实现是:

public boolean isInMultiWindowMode() {
    try {
        return ActivityManagerNative.getDefault().isInMultiWindowMode(mToken);
    } catch (RemoteException e) {
    }
    return false;
}

有什么解决方法吗?

在片段内部,您可以使用

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
    {
        if (((Activity)getContext()).isInMultiWindowMode())
        {
        }
    }

我认为在没有
活动的情况下执行此操作的唯一方法是使用
AccessibilityService
,该服务具有获取当前显示的窗口列表的权限,并检查是否存在类型为
AccessibilityIndowInfo.type_SPLIT_SCREEN_DIVIDER
的窗口

例如,可以使用以下方法执行此操作:

private boolean inSplitScreenMode(List<AccessibilityWindowInfo> windows) {
    for (AccessibilityWindowInfo window : windows) {
        if (window.getType() == AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER) {
            return true;
        }
    }
    return false;
}

您想检查哪里?内部片段?无论您去哪里,当特定应用程序进入多窗口模式时,您都可以访问位于顶部的活动之一stack@Jai由于屏幕逻辑的封装,通过层次结构,我无法访问activity。您也可以在活动中使用listener onMultiWindowChanged,但我无法访问I’’我不知道如何更新你的子类,如果你能告诉我关系和层次结构,我可以帮你that@Jai我发现了一个相当危险的解决方案。我可以访问方法
getContext()
返回一个
上下文
类。在将其强制转换为
活动后
可以访问此方法。感谢您Hey@alex这正是我要寻找的,用于检测设备何时进入分屏模式。但不幸的是,您提供的
inSplitScreenMode
方法不起作用。是否缺少任何内容?@您是否有一个正确的设置
AccessibilityService
(即接收
AccessibilityEvent
s)?为了检测到这一点,您的服务不得通过提供适当的
android:packageNames
属性来过滤系统应用程序中的事件。最后,与所有android API一样,这在很大程度上取决于制造商的实现(我个人在运行android 9的Pixel 3上测试了这一点)@AlexLonescu成功了!accessibilityFlag,flagRetrieveInteractiveWindows在accessibility.xml中丢失了。:@MayurMore忘记了服务标志,因为已经有一段时间了。很高兴它起作用了:D
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if ((event.getEventType() & AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) != 0) {
        if (inSplitScreenMode(getWindows()) {
            Log.d(TAG, "Split screen mode detected");
        } else {
            Log.d(TAG, "No split screen");
        }
    }
}