检查屏幕是否处于多窗口模式而不需要活动界面

4

如果我没有访问Activity的权限,有没有办法找出屏幕是否被分割?(从结构上来说,我无法调用isInMultiWindowMode方法。

我发现默认的Activity#isInMultiWindowMode()实现为:

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

有没有解决办法?

你想要在哪里进行检查?在片段内吗? - Jai
无论您去哪里,当特定应用进入多窗口模式时,您将可以访问其中一个处于顶部堆栈的活动。 - Jai
由于屏幕逻辑的封装,我无法访问Activity,因此通过层次结构来访问@Jai。 - Andrii Abramov
你也可以在你的活动中使用 onMultiWindowChanged 监听器,但我不确定如何更新你的子类。如果你能告诉我关系和层次结构,我可以帮助你解决这个问题。 - Jai
1
@Jai 我发现了一个相当有风险的解决方案。我可以访问getContext()方法,它返回一个Context类。并将其强制转换为Activity后可以访问此方法。谢谢 - Andrii Abramov
2个回答

4

我认为在没有Activity的情况下实现此操作的唯一方法是使用具有获取当前显示窗口列表权限的AccessibilityService,并检查是否存在一个类型为AccessibilityWindowInfo.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;
}

当接收到窗口状态改变的无障碍事件时,请检查此方法。

@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");
        }
    }
}

嘿@alex,这正是我正在寻找的,用于检测设备何时进入分屏模式。但不幸的是,你提供的方法inSplitScreenMode不起作用。有什么遗漏吗? - Mayur More
@MayurMore,你是否已经正确设置了AccessibilityService(即接收AccessibilityEvent)?为了检测这一点,您的服务不能通过提供适当的android:packageNames属性来过滤系统应用程序中的事件。最后,与所有Android API一样,这在制造商实现方面有很大的差异(就我个人而言,我在运行Android 9的Pixel 3上测试了这一点)。 - Alex Ionescu
@AlexLonescu,成功了!accessibility.xml 中缺少 accessibilityFlag、flagRetrieveInteractiveWindows。 :) - Mayur More
@MayurMore 忘记了服务标志,因为已经有一段时间了。很高兴它正在工作 :D - Alex Ionescu

3

在片段中,您可以使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接