How to detect MotionEvent.ACTION_DOWN in service Android

android, android-service, android-widget

Solution

First of all make your Layout according to overlay.you are setting width and height match_parent which is cover whole screen so that you are not accessing application which is outside of your application.

 package anew.mikka.myapplication;

    import android.app.Service;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.os.IBinder;
    import android.view.Gravity;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.WindowManager;
    import android.view.View.OnTouchListener;
    import android.widget.Button;
    import android.widget.Toast;

    public class max extends Service implements View.OnTouchListener {
        Button mButton;
        @Override
        public IBinder
        onBind(Intent intent) {
            return null;
        }

        @Override
        public void onCreate() {
            super.onCreate();
            //mView = new HUDView(this);
            mButton = new Button(this);
            mButton.setText("Overlay button");
            mButton.setOnTouchListener(this);

            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_TOUCH_MODAL
                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                    PixelFormat.TRANSLUCENT);
            params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
            params.setTitle("Load Average");
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.addView(mButton, params);

        }

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

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Toast.makeText(this,"Overlay button event", Toast.LENGTH_SHORT).show();
            return false;
        }


    }

Problem

I am running a background service to detect MotionEvent.ACTION_DOWN in Android 5.0. I used bellow code and it can detect my touch event but i cannot touch other apps. How can I fix it? If you have a better solution, please give me. Thank all. ``` public class TouchServiceListener extends Service implements OnTouchListener { private WindowManager mWindowManager; // linear layout will use to detect touch event private LinearLayout touchLayout; @Override public void onCreate() { super.onCreate(); touchLayout = new LinearLayout(this); // set layout width 30 px and height is equal to full screen LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); touchLayout.setLayoutParams(lp); // set color if you want layout visible on screen touchLayout.setBackgroundColor(Color.CYAN); // set on touch listener touchLayout.setOnTouchListener(this); // fetch window manager object mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // set layout parameter of window manager WindowManager.LayoutParams mParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, // width of layout 30 px WindowManager.LayoutParams.MATCH_PARENT, // height is equal to full screen WindowManager.LayoutParams.TYPE_PHONE, // Type Ohone, These are non-application windows providing user interaction with the phone (in particular incoming calls). WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // this window won't ever get key input focus PixelFormat.TRANSLUCENT); mParams.gravity = Gravity.LEFT | Gravity.TOP; Log.i(TAG, "add View"); mWindowManager.addView(touchLayout, mParams); } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if(motionEvent.getAction() == MotionEvent.ACTION_UP|motionEvent.getAction() == MotionEvent.ACTION_DOWN) { Log.d(TAG, "Touch me"); } return true; } @Override public IBinder onBind(Intent intent) { return null; } } ``` Manifest ``` <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ```

Original source