2016-10-24 4 views
6

Ich verwende einen Hintergrunddienst, um MotionEvent.ACTION_DOWN in Android 5.0 zu erkennen. Ich habe den bellow-Code benutzt und er kann mein Touch-Event erkennen, aber ich kann andere Apps nicht anfassen. Wie kann ich es reparieren? Wenn Sie eine bessere Lösung haben, geben Sie mir bitte. Allen danken.So erkennen Sie MotionEvent.ACTION_DOWN im Dienst Android

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" /> 

Antwort

6

Zu allererst Ihr Layout macht nach overlay.you Breite einstellen und Höhe match_parent die ganzen Bildschirm bedecken, so dass Sie nicht Anwendung zugreifen, die außerhalb Ihrer Anwendung ist .

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; 
     } 


    } 
+0

Ich habe es vorher versucht. Aber ich kann keine Apps drücken, wenn ich den obigen Code verwende. Könnten Sie es versuchen? – Jame

+0

Ich habe diesen Code nach diesem Beitrag hier versucht.Wenn Sie auf eine andere Anwendungssteuerung zugreifen möchten, dann ist es nicht möglich. –

+0

Vielen Dank. Ich habe es getestet. Entschuldigung für die Verspätung. Dein Code ist bearbeitet. Es zeigte jedoch eine Schaltfläche auf meinem Bildschirm. Ich habe versucht, es unsichtbar zu machen, aber die Berührung wird nicht sichtbar, wenn ich es unsichtbar mache. – Jame

Verwandte Themen