9
votes

Comment détecter lorsque l'utilisateur lance une autre application? (Android)

J'essaie de créer une application dans laquelle ma demande s'exécute en arrière-plan et détecte lorsque l'utilisateur lance une autre application afin que je puisse contrôler le flux de celui-ci. Pour illustrer ma requête, je voudrais spécifier un exemple. Mon application est en cours d'exécution (par exemple comme un service) et l'utilisateur vient de cliquer sur l'application 'XYZ'. Est-il possible que mon application détecte cette application 'XYZ' a été lancée? Plus que de simplement détecter si l'activité de XYZ est arrivée au premier plan, je souhaite détecter sur la base de la "XYZ" ou non. Dites que quelqu'un lance 'WhatsApp Messenger', je veux savoir si mon application peut savoir que "WhatsApp Messenger" a été lancé.

Edit: Beaucoup de gens pensent que j'essaie de construire des logiciels malveillants, mais je ne suis pas. J'essaie de construire une application pour un projet de lycée. Je veux une statistique pour voir combien de fois j'utilise ma caméra dans le cadre d'un projet psychologique. : /

Merci d'avance, Sumit.


3 commentaires

Pourquoi voudriez-vous faire cela? Pour citer " afin que je puisse contrôler le flux de celui-ci " qui sonne sify.


J'essaie de créer une application pour un projet de lycée. Pas de logiciels malveillants. :(


Dupliqué possible de Stackoverflow.com/ Questions / 3290936 / ...


4 Réponses :


1
votes

Je suppose que vous devriez consulter les applications "App Protecteur d'applications" dans Google Play. Ils détectent que l'utilisateur a lancé une autre application. Cela se fait en lisant les journaux du système. Essayez d'ouvrir LOGCAT et de lire les journaux après avoir lancé toute application sur le périphérique. Vous serez surpris.

Et où devriez-vous aller de là? Je suppose que vous devriez essayer Application Alogcat . C'est une source et une source ouverte. Cela vous aidera à lire réellement les journaux.

Tout cela est considéré comme une violation de la sécurité à Android par certains développeurs, cependant.


3 commentaires

Est-il vrai que Google va bloquer la lecture du journal dans les niveaux d'API 16 et plus?


@gonzobrains déjà, je suppose. Vous pouvez lire des journaux uniquement émis par votre propre PID.


@gonzobrains Oui, je bloque au-dessus de l'API 16. M Déterminez également le code source pour le déjeuner d'applications Même. Pouvez-vous m'aider pour même



3
votes

Oui, vous pouvez trouver la quelle application lancée en suivant la logcat forte>. Juste suivre sur ActivityManager Strong> Tag avec Info -I -I STRUT> LOG.

de la commande shell adb est, p> xxx pré>

à partir de votre code d'application, p> xxx pré>

et dans logcat, vous pouvez trouver une ligne quelque chose comme, p> xxx pré>

lorsque toute application sera lancée. p>

Il s'agit de la sortie LOGCAT indiquant que le message se rapporte au niveau de priorité "I" et Tag "ActivitecteManager": P>

Mise à jour: strong> p>

Il suffit d'ajouter la permission dans le fichier manifeste de votre application, P>

android.permission.READ_LOGS


2 commentaires

Avertissement équitable: cette méthode n'est pas une balle. Certains des nouveaux téléphones (j'ai été témoin sur GS3) ne mettent plus le paquet / l'activité dans cette déclaration de journal. Si vous êtes indifférent à la préformance, vous pouvez toutefois continuer à interroger l'ActivityManager.GetRecentTasts () de savoir quand et ce qui est lancé.


ne fonctionnera pas de Jellybean +. Read_Logs La permission est désormais réservée aux applications système uniquement.?



-1
votes

Dans mon livre, par la manière dont vous avez posé la question, cela ressemble à une application à la recherche d'une application d'une certaine manière pour votre service de contrôler, à la limite de Malware Jinx. Mais cela ne fonctionnera pas dans Android - simple et simple en raison des autorisations de chaque application est différente. Ainsi, chaque application est isolée les unes des autres. Donc, pour répondre à votre question franchement, son numéro

Comme l'autre réponse suggérée - vous pouvez surveiller le logcat mais.. Retour à nouveau ... pourquoi?


4 commentaires

Dans la mesure où cela fait partie de l'API publique, je ne vois aucune raison de ne pas le faire.


@Mighter Demandez-vous à l'op pourquoi il veut contrôler une application d'un service? Bien sûr, sa partie de l'API publique et "Vous ne voyez aucune raison de ne pas le faire", à droite, si j'ai découvert que cette application faisait cela - un mot - désinstaller .


Sûr qu'il veut construire un logiciel malveillant.


Comme je l'ai dit, j'essaie de construire une application pour un projet de lycée. Je n'essaie pas de construire des logiciels malveillants. : |



1
votes

J'ai fait un service qui peut détecter si d'autres applications se lancent. Je l'ai fait pour le numéroteur. De même, cela peut être remplacé par n'importe quel nom de package.

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show();

    final String str = "";
    Timer timer  =  new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        int phonelaunched = 0,phoneclosed =0;
        int phonelaunches = 1;
        @Override
        public void run() {
            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

            for ( ActivityManager.RunningAppProcessInfo appProcess: runningAppProcessInfo ) {
                Log.d(appProcess.processName.toString(),"is running");
                if (appProcess.processName.equals("com.android.dialer")) {
                    if ( appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND  /*isForeground(getApplicationContext(),runningAppProcessInfo.get(i).processName)*/){
                        if (phonelaunched == 0 ){
                            phonelaunched = 1;
                            Log.d(str,"dude phone has been launched");
                        }
                        else if (phoneclosed == 1){
                            phonelaunches++;
                            phoneclosed = 0;
                            Log.d(String.valueOf(phonelaunches),"dude that was counter");
                        }
                    }
                    else {
                        phoneclosed = 1;
                        Log.d(str,"dude phone has been closed");

                    }
                }
            }
        }
    },2000,3000);

    return START_STICKY;
}


2 commentaires

Ce code ne fonctionnera plus à Android L. Utilisez le paquet android.app.App.Ungage . développeur.android.com/reference/android/app/usage/ ...


Mais je devais l'écrire pour les appareils courants en dessous de la sucette. Peut-on utiliser directement Android.App.App.Unage dans les périphériques de sucettes ci-dessous ??