如何在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进行手势检测