2012-11-12 91 views
4

有沒有一種方法可以在任何android應用程序之上繪製覆蓋窗口?在Android系統中繪製覆蓋圖(系統範圍)

我正在使用Android x86端口並擁有系統權限。

@編輯:覆蓋下面的視圖應該會收到所有事件。

+0

AFAIK在SDK中沒有合法的方式來做到這一點。然而市場上的一些應用程序已經設法完成了它。 如果你確實找到一種方法,我不會指望它永遠在工作,他們選擇不包含一個公開的API爲此有效的安全原因。 – FoamyGuy

+0

不適用於Android市場。我想修改Android本身。 – Friedrich

回答

8

這是可能做到這一點通過創建一個Service,增加了當前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> 

and st藝術它:

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

此解決方案是否可以將所有事件傳遞到疊加層下面的視圖?我忘記了這個問題。 – Friedrich

+0

你只需要添加'WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE'標誌 – fiddler