Friedrich
Friedrich

Reputation: 645

Draw Overlay in Android (system wide)

Is there a way to draw an overlay window always on top of any android application?

I am using Android x86 port and have system rights.

@Edit: The view below the overlay should receive all events.

Upvotes: 6

Views: 7120

Answers (2)

Gk Mohammad Emon
Gk Mohammad Emon

Reputation: 6956

You can use my library just removing this method addWatermarkWithinApplicationLifecycle() which sticks the overlay with the app lifecycle (As you want to show the overlay all over the phone app). Please also don't forget to add these permissions -

<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"/>

The gif preview of my library -

enter image description here

Upvotes: 0

sdabet
sdabet

Reputation: 18670

It's possible to do that by creating a Service that adds the view in the 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;
    }   
}

But you need this extra permission:

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

And then just register the service in the manifest:

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

and start it:

startService(new Intent(this, OverlayService.class));

Upvotes: 10

Related Questions