在 Android 8.0 以上。有啥方法可以知道系统中是不是开启了 pip 模式

Posted

技术标签:

【中文标题】在 Android 8.0 以上。有啥方法可以知道系统中是不是开启了 pip 模式【英文标题】:In Android 8.0 above. Is there any way to know there is pip mode on in the system在 Android 8.0 以上。有什么方法可以知道系统中是否开启了 pip 模式 【发布时间】:2018-05-31 13:44:10 【问题描述】:

在安卓奥利奥中。 Activity 可以进入 pip 模式并返回启动器。

https://developer.android.com/guide/topics/ui/picture-in-picture.html

现在我是发射器。有什么方法可以知道当前屏幕上显示了一个 pip 窗口吗?

isInPictureInPictureMode()只表示你的应用pipmode,如果有其他应用进入pip模式则为false。

当您退出应用程序并返回 pipmode 回到启动器时,意图标志是相同的。

12-15 03:31:39.580 11671 11671 D FLAG_ACTIVITY_FORWARD_RESULT
12-15 03:31:39.580 11671 11671 D FLAG_ACTIVITY_NEW_TASK
12-15 03:31:39.580 11671 11671 D FLAG_ACTIVITY_PREVIOUS_IS_TOP
12-15 03:31:39.581 11671 11671 D FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
12-15 03:31:39.581 11671 11671 D FLAG_RECEIVER_BOOT_UPGRADE
12-15 03:31:39.581 11671 11671 D FLAG_RECEIVER_FOREGROUND
12-15 03:31:39.581 11671 11671 D FLAG_RECEIVER_INCLUDE_BACKGROUND
12-15 03:31:39.581 11671 11671 D FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS
12-15 03:31:50.174 11671 11671 D FLAG_ACTIVITY_FORWARD_RESULT
12-15 03:31:50.174 11671 11671 D FLAG_ACTIVITY_NEW_TASK
12-15 03:31:50.174 11671 11671 D FLAG_ACTIVITY_PREVIOUS_IS_TOP
12-15 03:31:50.174 11671 11671 D FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
12-15 03:31:50.174 11671 11671 D FLAG_RECEIVER_BOOT_UPGRADE
12-15 03:31:50.174 11671 11671 D FLAG_RECEIVER_FOREGROUND
12-15 03:31:50.174 11671 11671 D FLAG_RECEIVER_INCLUDE_BACKGROUND
12-15 03:31:50.174 11671 11671 D FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS

我检查了 pip 模式源代码,他们通过WindowManagerService 控制它。我不认为它可以通过应用程序级别访问。

【问题讨论】:

一种方法是您可以构建一个AccessibilityService,它可以在AccessibilityWindowInfos 中查询isInPictureInPictureMode()。请注意,谷歌目前(2017 年末)正在追捕滥用无障碍服务功能,所以要小心。只有在找不到更好的解决方案时才使用它。 developer.android.com/reference/android/view/accessibility/… 我在 ServiceConnected 中使用 List<AccessibilityWindowInfo> windows = getWindows(); 查询 Windows。它什么都没有,这正常吗?此方法也需要手动打开可访问性。 您需要请求某些权限才能使无障碍服务工作。用户必须批准它的注册。见developer.android.com/training/accessibility/service.html 酷。此解决方案适用于限制。该标志称为 FLAG_RETRIEVE_INTERACTIVE_WINDOWS。详细信息在函数getWindows(); 的注释中指定,但这需要用户在设置中交互辅助功能。拥有完全无用户反应的解决方案会很好。 有趣的是,没有其他公共 API 可以做到这一点。我暂时将其作为答案发布,直到有人找到更好的解决方案。 【参考方案1】:

您可以构建一个AccessibilityService,它可以在AccessibilityWindowInfos 中查询isInPictureInPictureMode()

请注意,Google 目前(2017 年末)正在追查滥用无障碍服务功能的行为,因此请谨慎行事。这种方法很可能被视为滥用。只有在找不到更好的解决方案时才使用它。

请参阅Developing an Accessibility Service 获取指南。

请注意,这需要提示用户许可,并且用户必须明确接受无障碍服务。

【讨论】:

以上是关于在 Android 8.0 以上。有啥方法可以知道系统中是不是开启了 pip 模式的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2017 中默认无法开发 Android 8.0 及以上系统的解决方案

android 8.0以上监听app安装

android 8.0以上打开系统文件管理器

android 8.0以上打开系统文件管理器

android 8.0以上打开系统文件管理器

android 8.0以上打开系统文件管理器