web-dev-qa-db-de.com

Erstellen eines System-Overlay-Fensters (immer oben)

Ich versuche, eine Schaltfläche "Always-Op-Top"/ein anklickbares Bild Zu erstellen, die die ganze Zeit über alle Fenster angezeigt wird. 

Der Beweis für Konzept ist 

Ich war erfolgreich und habe jetzt einen laufenden Dienst. Der Dienst Zeigt immer etwas Text in der oberen linken Ecke des Bildschirms an, während der __.-Benutzer auf andere Weise mit anderen Apps frei interagieren kann. 

Ich mache Ist die Unterklasse ViewGroup und füge sie mit Flag TYPE_SYSTEM_OVERLAY dem Root Window Manager hinzu. Jetzt möchte ich einen Button/ein anklickbares Bild Anstelle dieses Textes hinzufügen, der Berührungsereignisse auf sich selbst aufnehmen kann. Ich habe versucht, "onTouchEvent" für die gesamte ViewGroup zu überschreiben, aber Empfängt kein Ereignis. 

Wie kann ich Ereignisse nur für bestimmte Teile meiner ___ immer sichtbaren Ansichtsgruppe erhalten? Bitte vorschlagen.

public class HUD extends Service {
    HUDView mView;

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

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
        mView = new HUDView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                0,
//              WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
//                      | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show();
        if(mView != null)
        {
            ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
            mView = null;
        }
    }
}

class HUDView extends ViewGroup {
    private Paint mLoadPaint;

    public HUDView(Context context) {
        super(context);
        Toast.makeText(getContext(),"HUDView", Toast.LENGTH_LONG).show();

        mLoadPaint = new Paint();
        mLoadPaint.setAntiAlias(true);
        mLoadPaint.setTextSize(10);
        mLoadPaint.setARGB(255, 255, 0, 0);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawText("Hello World", 5, 15, mLoadPaint);
    }

    @Override
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //return super.onTouchEvent(event);
        Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
        return true;
    }
}
255
coreSOLO

Dies könnte eine dumme Lösung sein. Aber es funktioniert. Wenn Sie es verbessern können, lassen Sie es mich wissen.

OnCreate Ihres Service: Ich habe das WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH-Flag verwendet. Dies ist die einzige Serviceänderung.

@Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
        mView = new HUDView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

Jetzt werden Sie mit jedem Klickereignis beginnen. Sie müssen also in Ihrem Event-Handler korrigieren.

In Ihrem ViewGroup-Touch-Event

@Override
public boolean onTouchEvent(MotionEvent event) {

    // ATTENTION: GET THE X,Y OF EVENT FROM THE PARAMETER
    // THEN CHECK IF THAT IS INSIDE YOUR DESIRED AREA


    Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
    return true;
}

Möglicherweise müssen Sie diese Berechtigung auch Ihrem Manifest hinzufügen:

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />
148
Sarwar Erfan

Nach der Antwort von @Sam Lu.... Tatsächlich verhindert Android 4.x, dass bestimmte Arten von Berührungsereignissen von außen abgehört werden, einige Typen wie TYPE_SYSTEM_ALERT erledigen jedoch immer noch die Aufgabe. 

Beispiel

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);

    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View myView = inflater.inflate(R.layout.my_view, null);
    myView.setOnTouchListener(new OnTouchListener() {
       @Override
       public boolean onTouch(View v, MotionEvent event) {
           Log.d(TAG, "touch me");
           return true;
       }
     });

    // Add layout to window manager
    wm.addView(myView, params);

Berechtigungen

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>
61
amirlazarovich

Ab Android 4.x hat das Android-Team ein potenzielles .__-Sicherheitsproblem behoben, indem eine neue Funktion adjustWindowParamsLw() hinzugefügt wurde, in der FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE und FLAG_WATCH_OUTSIDE_TOUCH-Flags für TYPE_SYSTEM_OVERLAY-Fenster hinzugefügt wird.

Das heißt, ein TYPE_SYSTEM_OVERLAY-Fenster empfängt keine Berührungsereignisse auf der Plattform ICS und die Verwendung von TYPE_SYSTEM_OVERLAY ist natürlich keine praktikable Lösung für ICS und zukünftige Geräte.

16
Sam Lu

Ich bin einer der Entwickler des Tooleap SDK . Wir bieten auch eine Möglichkeit für Entwickler, immer in den oberen Fenstern und Schaltflächen anzuzeigen, und wir haben uns mit einer ähnlichen Situation befasst.

Ein Problem, auf das die Antworten hier nicht eingegangen sind, ist das von Android "Secured Buttons".

Gesicherte Schaltflächen haben die Eigenschaft filterTouchesWhenObscured, was bedeutet, dass sie nicht interaktiv sind, wenn sie unter einem Fenster platziert sind, auch wenn dieses Fenster keine Berührungen erhält. Zitieren der Android-Dokumentation:

Gibt an, ob Berührungen gefiltert werden sollen, wenn das Fenster der Ansicht verdeckt ist durch ein anderes sichtbares Fenster. Bei der Einstellung true erhält die Ansicht nicht berührt, wenn ein Toast, ein Dialogfenster oder ein anderes Fenster über der .__ angezeigt wird. Sichtfenster Weitere Informationen finden Sie in der {@link Android.view.View} -Sicherheit Dokumentation für weitere Details.

Ein Beispiel für eine solche Schaltfläche ist die Schaltfläche install, wenn Sie versuchen, Drittanbieter-APKs zu installieren. Jede App kann eine solche Schaltfläche anzeigen, wenn Sie dem Ansichtslayout die folgende Zeile hinzufügen:

Android:filterTouchesWhenObscured="true"

Wenn Sie über einer "gesicherten Schaltfläche" ein immer geöffnetes Fenster anzeigen, können alle gesicherten Schaltflächenteile, die von einer Überlagerung abgedeckt werden, keine Berührungen bearbeiten, selbst wenn diese Überlagerung nicht anklickbar ist. Wenn Sie also planen, ein solches Fenster anzuzeigen, sollten Sie dem Benutzer eine Möglichkeit bieten, das Fenster zu verschieben oder zu verwerfen. Wenn ein Teil Ihres Overlays transparent ist, sollten Sie berücksichtigen, dass der Benutzer möglicherweise verwirrt ist, warum dies der Fall ist Eine bestimmte Schaltfläche in der zugrundeliegenden App funktioniert nicht plötzlich für ihn.

12
Danny

ARBEITEN IMMER AUF DEM BILD AUF DEM OBENEN BILD

zunächst entschuldige mich für mein englisch

ich bearbeite Ihre Codes und mache einen funktionierenden Bild-Button, der sein Berührungsereignis überwacht.

es gibt auch Touch-Hörern, die aus anderen Elementen bestehen

schaltflächenveränderungen sind unten und links

sie können Änderungen vornehmen, aber Sie müssen cordinats in touch event im if -Element ändern

import Android.annotation.SuppressLint;

import Android.app.Service;
import Android.content.Context;
import Android.content.Intent;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.PixelFormat;
import Android.os.IBinder;
import Android.util.Log;
import Android.view.Gravity;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.View.OnTouchListener;
import Android.view.ViewGroup;
import Android.view.WindowManager;
import Android.widget.Toast;

public class HepUstte extends Service {
    HUDView mView;

    @Override
    public void onCreate() {
        super.onCreate();   

        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();

        final Bitmap kangoo = BitmapFactory.decodeResource(getResources(),
                R.drawable.logo_l);


        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                kangoo.getWidth(), 
                kangoo.getHeight(),
                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.LEFT | Gravity.BOTTOM;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);



        mView = new HUDView(this,kangoo);

        mView.setOnTouchListener(new OnTouchListener() {


            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                // TODO Auto-generated method stub
                //Log.e("kordinatlar", arg1.getX()+":"+arg1.getY()+":"+display.getHeight()+":"+kangoo.getHeight());
                if(arg1.getX()<kangoo.getWidth() & arg1.getY()>0)
                {
                 Log.d("tıklandı", "touch me");
                }
                return false;
            }
             });


        wm.addView(mView, params);



        }



    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}



@SuppressLint("DrawAllocation")
class HUDView extends ViewGroup {


    Bitmap kangoo;

    public HUDView(Context context,Bitmap kangoo) {
        super(context);

        this.kangoo=kangoo;



    }


    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);


        // delete below line if you want transparent back color, but to understand the sizes use back color
        canvas.drawColor(Color.BLACK);

        canvas.drawBitmap(kangoo,0 , 0, null); 


        //canvas.drawText("Hello World", 5, 15, mLoadPaint);

    }


    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    }

    public boolean onTouchEvent(MotionEvent event) {
        //return super.onTouchEvent(event);
       // Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();

        return true;
    }
}
11
Onur Öztürk

Sie können WindowManager.LayoutParams.TYPE_SYSTEM_ERROR anstelle von TYPE_SYSTEM_OVERLAY tatsächlich ausprobieren. Es mag sich wie ein Hack anhören, aber Sie können die Ansicht über alles anzeigen und trotzdem Berührungsereignisse erhalten.

6
Ov3r1oad

Versuche dies. Funktioniert gut in ICS ..__ Wenn Sie den Dienst beenden möchten, klicken Sie einfach auf die in der Statusleiste generierte Benachrichtigung. 

 public class HUD extends Service
 {
    protected boolean foreground = false;
    protected boolean cancelNotification = false;
    private Notification notification;
    private View myView;
    protected int id = 0;
    private WindowManager wm;
    private WindowManager.LayoutParams params;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
       // System.exit(0);
        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_SHORT).show();
        params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
        params.gravity=Gravity.TOP|Gravity.LEFT;
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    inflateview();
    foregroundNotification(1);
    //moveToForeground(1,n,true);
    }     
   @Override
    public void onDestroy() {
        super.onDestroy();
        ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).cancel(0);
        Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_SHORT).show();
        if(myView != null)
        {
            ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(myView);
            myView = null;
        }
    }
    protected Notification foregroundNotification(int notificationId) 
   {    
    notification = new Notification(R.drawable.ic_launcher, "my Notification", System.currentTimeMillis());    
        notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT | Notification.FLAG_ONLY_ALERT_ONCE;   
        notification.setLatestEventInfo(this, "my Notification", "my Notification", notificationIntent());          
        ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(id, notification);            
        return notification;
    }
    private PendingIntent notificationIntent() {
        Intent intent = new Intent(this, stopservice.class);    
        PendingIntent pending = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);    
        return pending;
    }
    public void inflateview()
    {
         LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            myView = inflater.inflate(R.layout.activity_button, null);
            myView.setOnTouchListener(new OnTouchListener() {
               @Override
               public boolean onTouch(View v, MotionEvent event) {
                   Toast.makeText(getBaseContext(),"onToasttt", Toast.LENGTH_SHORT).show();
                   return false;
               }
             });
            // Add layout to window manager
            wm.addView(myView, params); 
    }
}

UPDATE

Probe hier

Um eine Überlagerungsansicht zu erstellen, setzen Sie beim Einrichten der LayoutParams NICHT den Typ auf TYPE_SYSTEM_OVERLAY.

Instead set it to TYPE_PHONE.

Use the following flags:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

Es verwendet die Erlaubnis "Android.permission.SYSTEM_ALERT_WINDOW". Vollständige Anleitung für diesen Link: http://androidsrc.net/facebook-chat-like-floating-chat-heads/

2
AmAn yAdAv

Hier ist eine einfache Lösung Alles, was Sie brauchen, ist, das XML-Layout genau wie bei Listenadaptern aufzublasen.

 public class HUD extends Service {
    View mView;

    LayoutInflater inflate;
    TextView t;
    Button b;

    @Override
    public void onCreate() {
        super.onCreate();   

        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();


        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

        Display display = wm.getDefaultDisplay();  get phone display size
        int width = display.getWidth();  // deprecated - get phone display width
        int height = display.getHeight(); // deprecated - get phone display height 


        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                width, 
                height,
                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.LEFT | Gravity.CENTER;
        params.setTitle("Load Average");

        inflate = (LayoutInflater) getBaseContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        mView = inflate.inflate(R.layout.canvas, null);

        b =  (Button) mView.findViewById(R.id.button1);
        t = (TextView) mView.findViewById(R.id.textView1);
        b.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            t.setText("yes you click me ");
        }
       });

        wm.addView(mView, params);

        }



    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}
2
user1668168

mit dem Service können Sie folgendes erreichen: 

public class PopupService extends Service{

    private static final String TAG = PopupService.class.getSimpleName();
    WindowManager mWindowManager;
    View mView;
    String type ;

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
//        registerOverlayReceiver();
        type = intent.getStringExtra("type");
        Utils.printLog("type = "+type);
        showDialog(intent.getStringExtra("msg"));
        return super.onStartCommand(intent, flags, startId);
    }

    private void showDialog(String aTitle)
    {
        if(type.equals("when screen is off") | type.equals("always"))
        {
            Utils.printLog("type = "+type);
            PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
            WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
            mWakeLock.acquire();
            mWakeLock.release();
        }

        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mView = View.inflate(getApplicationContext(), R.layout.dialog_popup_notification_received, null);
        mView.setTag(TAG);

        int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels / 2;

        LinearLayout dialog = (LinearLayout) mView.findViewById(R.id.pop_exit);
//        Android.widget.LinearLayout.LayoutParams lp = (Android.widget.LinearLayout.LayoutParams) dialog.getLayoutParams();
//        lp.topMargin = top;
//        lp.bottomMargin = top;
//        mView.setLayoutParams(lp);

        final EditText etMassage = (EditText) mView.findViewById(R.id.editTextInPopupMessageReceived);

        ImageButton imageButtonSend = (ImageButton) mView.findViewById(R.id.imageButtonSendInPopupMessageReceived);
//        lp = (LayoutParams) imageButton.getLayoutParams();
//        lp.topMargin = top - 58;
//        imageButton.setLayoutParams(lp);
        imageButtonSend.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Utils.printLog("clicked");
//                mView.setVisibility(View.INVISIBLE);
                if(!etMassage.getText().toString().equals(""))
                {
                    Utils.printLog("sent");
                    etMassage.setText("");
                }
            }
        });

        TextView close = (TextView) mView.findViewById(R.id.TextViewCloseInPopupMessageReceived);
        close.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                hideDialog();   
            }
        });

        TextView view = (TextView) mView.findViewById(R.id.textviewViewInPopupMessageReceived);
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                hideDialog();   
            }
        });

        TextView message = (TextView) mView.findViewById(R.id.TextViewMessageInPopupMessageReceived);
        message.setText(aTitle);

        final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
        WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
//                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,
        PixelFormat.RGBA_8888);

        mView.setVisibility(View.VISIBLE);
        mWindowManager.addView(mView, mLayoutParams);
        mWindowManager.updateViewLayout(mView, mLayoutParams);

    }

    private void hideDialog(){
        if(mView != null && mWindowManager != null){
            mWindowManager.removeView(mView);
            mView = null;
        }
    }
}
1
Akshay Paliwal

TYPE_SYSTEM_OVERLAY Diese Konstante wurde seit API-Level 26 ... veraltet. Verwenden Sie stattdessen TYPE_APPLICATION_OVERLAY.

1

Probieren Sie meinen Code aus, zumindest gibt es eine Zeichenfolge als Überlagerung. Sie können sie sehr gut durch eine Schaltfläche oder ein Bild ersetzen. Sie werden nicht glauben, dass dies meine erste Android-App LOL ist. Wenn Sie mehr Erfahrung mit Android-Apps haben als ich, versuchen Sie es bitte

  • Ändern der Parameter 2 und 3 in "new WindowManager.LayoutParams"
  • versuchen Sie es mit einem anderen Event-Ansatz
1
coreSOLO

Wenn jemand, der diesen Thread noch immer liest und nicht in der Lage ist, diese Funktion zum Laufen zu bringen, es mir sehr leid tut, Ihnen auf diese Weise mitzuteilen, dass Bewegungsereignisse abgefangen werden, gilt dies als Fehler und Korrektur in Android> = 4.2.

Das Bewegungsereignis, das Sie abgefangen haben, hat zwar die Aktion ACTION_OUTSIDE, gibt in getX Und getY 0 zurück. Das bedeutet, dass Sie weder die gesamte Bewegungsposition auf dem Bildschirm sehen noch etwas tun können. Ich weiß, dass der Doc sagte, dass er x und y bekommen wird, aber die Wahrheit ist, dass es NICHT wird. Es scheint, dass dies den Schlüssellogger blockiert.

Wenn jemand eine Problemumgehung hat, hinterlassen Sie bitte Ihren Kommentar.

ref: Warum gibt ACTION_OUTSIDE in KitKat 4.4.2 jedes Mal 0 zurück?

https://code.google.com/p/Android/issues/detail?id=72746

1
Nick Jian

Ich habe eine Bibliothek gefunden, die genau das tut: https://github.com/recruit-lifestyle/FloatingView

Im Stammverzeichnis befindet sich ein Beispielprojekt. Ich habe es ausgeführt und es funktioniert wie gewünscht. Der Hintergrund ist anklickbar - auch wenn es sich um eine andere App handelt.

 enter image description here

0

Die Antwort von @Sarwar Erfan funktioniert nicht mehr, da Android das Hinzufügen von Ansichten mit WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY zum Fenster nicht zulässt, um nicht mehr mit WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH zu berühren. 

Ich habe eine Lösung für dieses Problem gefunden. Sie können es in der folgenden Frage überprüfen

Wenn Fenster mit WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY Ansicht hinzugefügt wird, erhält es kein Berührungsereignis

0
patilmandar2007