Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将触摸事件从覆盖视图发送到后台_Android_Overlay_Touch Event_Dispatch - Fatal编程技术网

Android 将触摸事件从覆盖视图发送到后台

Android 将触摸事件从覆盖视图发送到后台,android,overlay,touch-event,dispatch,Android,Overlay,Touch Event,Dispatch,我有以下服务,可以在系统中的每个应用程序上显示覆盖视图,并获取触摸事件。由于类型_系统_警报,触摸无法进入后台,因此没有任何用处。我想我可以获得一个MotionEvent并使用我刚刚检测到的相同的x,y将其发送到背景视图 **问题:如何定义将事件发送到的背景视图?。鉴于我可以随时检测前台应用程序是什么,我是否可以定义该窗口的视图以便分派事件 public class OverlayService extends Service { LinearLayout oView; @O

我有以下服务,可以在系统中的每个应用程序上显示覆盖视图,并获取触摸事件。由于类型_系统_警报,触摸无法进入后台,因此没有任何用处。我想我可以获得一个MotionEvent并使用我刚刚检测到的相同的x,y将其发送到背景视图

**问题:如何定义将事件发送到的背景视图?。鉴于我可以随时检测前台应用程序是什么,我是否可以定义该窗口的视图以便分派事件

public class OverlayService extends Service {

    LinearLayout oView;

    @Override
    public IBinder onBind(Intent i) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        oView = new LinearLayout(this);   
        oView.setBackgroundColor(0x88ff0000); // The translucent red color
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                0 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);        
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(oView, params);

        oView.setOnTouchListener(new View.OnTouchListener() {

            @SuppressLint("Recycle")
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    int x = (int) event.getX();
                    int y = (int) event.getY();
                    long downTime = SystemClock.uptimeMillis();
                    long eventTime = SystemClock.uptimeMillis() + 100;
                    // List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
                    int metaState = 0;
                    MotionEvent motionEvent = MotionEvent.obtain(
                        downTime, 
                        eventTime, 
                        MotionEvent.ACTION_DOWN, 
                        x, 
                        y, 
                        metaState
                    );
                     Toast.makeText(getBaseContext(), Integer.toString(x)+"    "+Integer.toString(y), Toast.LENGTH_SHORT).show();
                    // Dispatch touch event to background
                    //              ?
                    //              ?
                    // Dispatch touch event to background



                }
                // Obtain MotionEvent object

                return false;
            }
        });

    }

    @Override
    public void onDestroy() {            
        super.onDestroy();
        if(oView!=null){
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.removeView(oView);
        }
    }

}

幸运的是,这是不可能的。GMD手势控制可以做到这一点。至于令人惊讶的评论:并不是每个人都有不好的意图。@user3051067:你找到解决方案了吗?不幸的是,没有……GMD使用root访问来解决这个问题。如果没有根访问权限,我认为这是不可能的。如果我没有根访问权限,该怎么做?