5

有没有办法总是在任何 android 应用程序之上绘制一个覆盖窗口?

我正在使用 Android x86 端口并拥有系统权限。

@Edit:覆盖下方的视图应该接收所有事件。

4

2 回答 2

9

Service可以通过创建一个在 current 中添加视图来做到这一点WindowManager

public class OverlayService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();

        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        View overlay = /* create your overlay here */;

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            PixelFormat.TRANSLUCENT);
        windowManager.addView(overlay , params);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }   
}

但是你需要这个额外的权限:

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

然后只需在清单中注册服务:

<service android:name=".OverlayService" ></service>

并启动它:

startService(new Intent(this, OverlayService.class));
于 2012-11-12T15:20:47.140 回答
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 预览 -

在此处输入图像描述

于 2020-09-15T04:11:31.580 回答