业务需求,定制的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();
}
}
}
网友评论