IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Capter les interactions de l'écran en background


Sujet :

Android

  1. #1
    Membre actif Avatar de IsiTech
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Janvier 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Janvier 2012
    Messages : 105
    Points : 268
    Points
    268
    Par défaut Capter les interactions de l'écran en background
    Bonsoir,

    Dans un projet j'ai besoin de capter toutes les interactions que l'utilisateur produira sur l'écran, peu importe l'application se situant au premier plan. Je sais tout à fait que c'est considéré comme une faille de sécurité qui est corrigée depuis ICS, mais c'est faisable dans les versions précédentes. Mon projet est dans le cadre de recherches et n'a pas vocation à être diffusé. Enfin me rappeler que ce que je cherche à produire est considéré comme une faille de sécurité ne m'aidera pas.

    Je suis parti du code trouvé ici, qui consiste à créer un service implémentant OnTouchListener et à placer un widget en Overlay. Voici le code que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    package com.smart.taskbar;
     
    import android.annotation.SuppressLint;
    import android.app.Service;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.GestureDetector.OnGestureListener;
    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 HUD extends Service implements OnTouchListener {
    	Button mButton;
     
        @Override
        public IBinder
        onBind(Intent intent) {
            return null;
        }
     
        @SuppressLint("NewApi")
    	@Override
        public void onCreate() {
            super.onCreate();
     
            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_OVERLAY,
                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                    PixelFormat.TRANSLUCENT);
            params.gravity = Gravity.LEFT | Gravity.TOP;
            params.setTitle("Load Average");
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.addView(empty, 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) {
           Log.d("TEST", event.getX() + " " + event.getY());
     
     
    		return true;
    	}
    }
    Cela fonctionne presque, mais la méthode onTouch n'est appelée qu'une seule fois malgré le "return true", ce qui empêche la détection des Drag.

    Il est possible de remplacer "TYPE_SYSTEM_OVERLAY" par "TYPE_SYSTEM_ALERT", cela permet de détecter les drags car onTouch est correctement appelée en boucle, cependant les évènements ne sont plus transmis à l'activité visible, ce qui rend le smartphone inutilisable.

    L'idéal serait donc de combiner les deux : pouvoir détecter les drags et que les évènements soient transmis à l'activité visible afin de ne pas déranger l'utilisateur.

    J'ai également essayé de créer une vue héritant de View et redéfinissant onTouchEvent mais le résultat est le même.

    Avez vous une quelconque piste? Je précise que l'API max disponible est 10, ICS supprimant l'effet de "TYPE_SYSTEM_OVERLAY".

    Merci et bonne soirée.

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    Par défaut
    Il faut faire comme les virus ou les hook systèmes, ils captent les événements et les redonnent à l'application en question.

    Donc dans ton onTouch, faire quelque-chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super.onTouch(v, event)
    serait l'idée
    Si la réponse vous a aidé, pensez à cliquer sur +1

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2006, 18h12
  2. Réponses: 3
    Dernier message: 18/10/2005, 21h14
  3. Réponses: 4
    Dernier message: 03/02/2005, 14h16
  4. capter les messages d'interbase dans une appli
    Par devalender dans le forum InterBase
    Réponses: 6
    Dernier message: 25/06/2004, 16h58
  5. [Sprite] Comment les afficher directement à l'écran
    Par fror dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/03/2004, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo