2012-11-12 66 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