Search code examples
androidlinuxoverlayframebuffer

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.


Solution

  • 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));