6

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.

Friedrich
  • 645
  • 11
  • 26
  • AFAIK there is no legit way to do it within the SDK. However some apps on the market have managed to accomplish it. If you do find a way I wouldn't count on it working forever, they chose not to include a public API for this for valid security reasons. – FoamyGuy Nov 12 '12 at 15:10
  • Is not intended for the Android market. I want to modify Android itself. – Friedrich Nov 12 '12 at 15:44

2 Answers2

10

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));
sdabet
  • 18,360
  • 11
  • 89
  • 158
  • Will this solution path-through all events to the views below the overlay? I have forgotten to add this to the question. – Friedrich Nov 12 '12 at 15:37
  • you just need to add the `WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE` flag – sdabet Nov 12 '12 at 15:53
0

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

Gk Mohammad Emon
  • 6,084
  • 3
  • 42
  • 42