如何在android 10中检测全屏手势模式

Posted

技术标签:

【中文标题】如何在android 10中检测全屏手势模式【英文标题】:How to detect full screen gesture mode in android 10 【发布时间】:2019-11-03 11:09:39 【问题描述】:

android 10 中,用户可以启用全屏手势模式。我想检测设备是否处于全屏手势模式。我在文档中找不到任何东西。如何在运行时以编程方式进行?

Java 或 kotlin 语言答案都可以。

任何官方 API 或解决方法...

【问题讨论】:

这些文章对您有帮助吗? developer.android.com/training/system-ui/immersive | developer.android.com/training/system-ui/visibility.html 我已经读过了。但找不到任何好的解决方案。我们可以使用系统栏计算,但它不适合所有设备和应用,因为它是非标准的! 你的意思是“全屏手势”的“全手势导航”吗? 你找到解决办法了吗? @A_Jayke 还没有。我仍然无法相信他们没有为此包含任何 API。 :// 【参考方案1】:

您可以使用以下代码检查手势或导航模式

    public static int isEdgeToEdgeEnabled(Context context) 
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier("config_navBarInteractionMode", "integer", "android");
        if (resourceId > 0) 
            return resources.getInteger(resourceId);
        
        return 0;
    

isEdgeToEdgeEnabled 函数返回的值如下:

0 : 导航显示有 3 个按钮

1 : 使用 2 个按钮显示导航(Android P 导航模式)

2:全屏手势(Android Q 上的手势)

【讨论】:

使用资源标识符可靠吗?我读到它们因设备而异,并且可能会随着时间而变化... 我在google的android Q源码上找到了资源标识符。所以我认为 OEM 会为全屏手势使用相同的 id。 重要!您需要用 try/catch 包围 resources.getInteger() 来处理 Resources.NotFoundException,否则此代码将在各种小米和三星设备上崩溃。此外,此代码不适用于华为设备。 在我的情况下(S21 Ultra,Android 11)config_navBarInteractionMode = 17694897,所以这个方法不是很可靠 这不起作用。我在小米设备上试过。它在手势和菜单按钮模式下都给出 0【参考方案2】:

我发现 this article 在解释 WindowInsets 是什么以及如何使用它们方面非常有用。

基本上我检查左侧手势插入是否大于0,如果是,则系统正在使用手势类型导航。在手势类型导航中左右手势插入必须大于0,因为您从右侧或左侧滑动才能返回。

int gestureLeft = 0;

if (Build.VERSION.SDK_INT >= 29) 
    gestureLeft = this.getWindow().getDecorView().getRootWindowInsets().getSystemGestureInsets().left;


if (gestureLeft == 0) 
    // Doesn't use gesture type navigation
 else 
    // Uses gesture type navigation

显然,必须渲染窗口才能使其正常工作。如果您希望它在窗口呈现后立即运行,您可以将其添加到 OnApplyWindowInsetsListener 中。

注意:我尝试使用getSystemGestureInsets().bottom,但即使我没有使用手势类型导航,它也会返回一个非零值。

【讨论】:

【参考方案3】:

根据文档,如果WindowInsets 有任何非零插入,则有一个hasInsets() 方法返回true。https://developer.android.com/reference/android/view/WindowInsets#hasInsets()我们可以这样使用它

view.rootWindowInsets.hasInsets()

希望这会有所帮助!

【讨论】:

它返回真,即使在手势模式下! 手势模式应该返回 true。否则为假。它的行为是否相应? 手势模式和非手势模式都返回true。

以上是关于如何在android 10中检测全屏手势模式的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 AVPlayerViewController 的全屏模式

如何在 Swift 中使用 AVPlayerViewController 检测全屏模式?

Android使用GestureDetector进行手势检测

Android使用GestureDetector进行手势检测

Android使用GestureDetector进行手势检测

如何在 Android 视觉 CameraSource 中添加放大/缩小手势