安卓:系统悬浮窗

9
如何叠加屏幕?
  1. it should be touchable
  2. view must overlay system action bar
  3. view must overlay soft buttons back/home/recent_apps
  4. Android 4.0 +

    public class MyService extends Service {
    
    @Override
    public void onCreate() {
        super.onCreate();
        WindowManager.LayoutParams params = ViewUtils.generateFullScreenParams(true);
    
        final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(overlayView, params);
    }
    ...
    }
    

和布局参数创建器

public static WindowManager.LayoutParams generateFullScreenParams() {
    return new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,

            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

            PixelFormat.TRANSLUCENT);
}

好的,看起来不错。

标志TYPE_SYSTEM_ALERT在Android 5.0以下版本不会叠加系统栏,也不会叠加软按钮,但是我可以处理触摸事件。

标志TYPE_SYSTEM_OVERLAY会叠加系统栏,不会叠加按钮,并且我无法处理触摸事件。

有什么想法吗?


为什么您要在没有标题栏的情况下设置全屏主题? - IshRoid
这个视图是从服务中附加的,但主题实际上适用于活动。如果我错了,请纠正我。 - VKDev
你在OnCreate里创建了一个Service内的View吗?就像对话框一样? - IshRoid
是的,我编辑了我的问题。 - VKDev
也许我可以在没有视图的情况下检测屏幕触摸事件吗?(适用于所有应用程序) - VKDev
显示剩余2条评论
2个回答

1
public static WindowManager.LayoutParams generateFullScreenParams() {
    return new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,

            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

            PixelFormat.TRANSLUCENT);
}

在这段代码中,你添加了WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,请删除此行代码,然后为视图添加触摸事件即可正常工作。
对于屏幕叠加权限,我参考了这篇文章如何默认启用屏幕叠加权限

0

你可以使用我的,只需删除此方法addWatermarkWithinApplicationLifecycle(), 它将在应用程序生命周期内与应用程序生命周期粘合(因为您想要在整个手机应用程序中显示叠加层)。我尝试以可重用的方式来完成它,这样你就可以通过简单的方法调用来隐藏和显示叠加层。请不要忘记添加这些权限 -

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"  />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/>

我的库的 GIF 预览 -

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接