美文网首页
无障碍服务accessibility获取状态栏状态(隐藏和显示)

无障碍服务accessibility获取状态栏状态(隐藏和显示)

作者: 大胡子的机器人 | 来源:发表于2019-11-19 10:18 被阅读0次

业务需求,定制的launcher桌面和状态栏,但系统的状态栏又还在,希望进入第三方app后仍然显示自己的状态栏。


image.png

由于系统定制,我们去掉了系统自带的状态栏,但厂商又没有去除干净,仅仅把有内容的状态栏的高度设置为0了,这就导致我们的状态栏不能设置为系统状态栏,仅仅是作为了悬浮窗浮在所有界面之上,在第三方app中就不好控制隐藏和显示,就比如上图中的计算器界面。

解决方案:

通过无障碍服务,监听界面状态,如果发现状态栏存在(即存在如下图的ID:android:id/statusBarBackground),那么把自定义的状态栏显示,如果不存在,那么就隐藏自定义的状态栏


image.png

注意无障碍服务的xml配置文件:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews|flagRetrieveInteractiveWindows"
    android:canRequestFilterKeyEvents="true"
    android:canRetrieveWindowContent="true"
    android:description="@string/app_name" />

无障碍服务代码:

public class BonvoAccessibilityService extends AccessibilityService {
...
  @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
            //查看当前页面是否属于第三方app,并且判断是否全屏
            try {
                List<AccessibilityWindowInfo> windowList = getWindows();
                for (AccessibilityWindowInfo win : windowList) {
                    List<AccessibilityNodeInfo> statusNodes = win.getRoot().findAccessibilityNodeInfosByViewId("android:id/statusBarBackground");
                    if (statusNodes != null && statusNodes.size() > 0 && !event.getPackageName().toString().contentEquals(getPackageName())) { //自己的应用自己管理状态栏
                        Log.e(TAG, "存在状态栏");
                        break;
                    }
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
    }

相关文章

网友评论

      本文标题:无障碍服务accessibility获取状态栏状态(隐藏和显示)

      本文链接:https://www.haomeiwen.com/subject/ufqwictx.html