我见过一些应用程序能够从辅助功能服务添加覆盖视图,当“设置”应用程序位于前台时,这些视图在锁定屏幕上也可见(!!)。
我已经实现了添加叠加层,但当“设置”应用程序位于前台和锁定屏幕上时,它们会自动隐藏。我也需要为我的应用程序实现这一点。
有人知道如何实现这一目标吗?
使用窗口管理器执行此操作的一种方法,TYPE_SYSTEM_OVERLAY。
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
View overlayView = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null);
wm.addView(overlayView, params);
为覆盖视图创建一个overlay_layout.xml 文件。
所以我找到了答案。方法是使用辅助功能服务并通过该服务添加覆盖视图,并使用 TYPE_ACCESSIBILITY_OVERLAY 作为 WindowManager.LayoutParams 中的类型参数。
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);