How to detect MotionEvent.ACTION_DOWN in Android service

I am running a background service to detect MotionEvent.ACTION_DOWN in Android 5.0. I used the following code and it can detect my touch event, but I can not touch other applications. How can i fix this? If you have a better solution, please give me. Thanks to everyone.

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" /> 
+6
source share
1 answer

First of all, make your layout according to overlay. You set the width and height of match_parent, which is the cover of the entire screen, so you do not get access to an application that 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; } } 
+6
source

Source: https://habr.com/ru/post/1011647/


All Articles