web-dev-qa-db-fra.com

Android, Détecter lorsque d'autres applications sont lancées

J'essaie de développer une application qui empêche un utilisateur d'accéder à une application spécifiée sans mot de passe. Le scénario est ...

  1. l'utilisateur clique sur l'application "E-mail" (par exemple)
  2. mon application détecte le lancement d'une application
  3. mon application confirme qu'il s'agit de l'application "Email"
  4. mon application ouvre une vue sur le dessus, demandant un mot de passe
  5. l'utilisateur entre un mot de passe, si correct, mon application disparaît, laissant l'application "Email" en haut

Je vais bien faire le reste, juste la partie 2 me laisse perplexe et après plusieurs jours à lire des informations sur les intentions de diffusion, etc. et à essayer d'écouter "Android.intent.action.MAIN", etc. dans mes projets d'essai, je ne peux semble détecter le moment où une application autre que la mienne est lancée.

Quelqu'un peut-il aider? Est-ce que je m'y prends de la bonne façon, en recherchant de nouvelles applications qui diffusent une intention de démarrer, ou devrais-je lire le journal du système pour connaître de nouvelles intentions ou faire quelque chose en code natif?

Tous les indicateurs seraient utiles, même si vous ne pouvez pas y répondre complètement, je pourrai faire d'autres recherches. Merci beaucoup. Ian

89
Ian

Je pense que nous pouvons utiliser logcat et analyser sa sortie.

Dans tous les programmes similaires, j'ai trouvé cette permission:

Android.permission.READ_LOGS

Cela signifie qu'ils l'utilisent tous, mais il semble que le programme a démarré et que, par la suite, notre programme (protecteur d'application) sera lancé et mis en avant.

Utilisez le code ci-dessous:

try
    {
        Process mLogcatProc = null;
        BufferedReader reader = null;
        mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});

        reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));

        String line;
        final StringBuilder log = new StringBuilder();
        String separator = System.getProperty("line.separator"); 

        while ((line = reader.readLine()) != null)
        {
            log.append(line);
            log.append(separator);
        }
        String w = log.toString();
        Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
    }
    catch (Exception e) 
    {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

Et n'oubliez pas d'ajouter sa permission dans le fichier Manifest.

33
M.Movaffagh

Une façon astucieuse de le faire est d’avoir un service avec une boucle chronométrée qui vérifie

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

Vous parcourez cette liste pour voir ce qui se passe au téléphone. Maintenant, vous pouvez les identifier avec les identifiants et nom_processus, donc pour une activité standard, cela est facile pour les personnes personnalisées, à moins que vous ne les arrêtiez, il est difficile de les distinguer ...

Note: Ce n'est pas une liste de ce qui est réellement à l'écran, juste une liste de ce qui est en cours d'exécution ... en annulant votre objectif peut-être, mais au moins vous saurez quand quelque chose commence à fonctionner .. Il restera cependant dans cette liste même en arrière-plan.

En ce qui concerne le mot de passe, vous pouvez simplement commencer votre activité lorsque vous avez trouvé une application protégée ou autre.

19
Aimeric

Je pense et espère que ce n'est pas possible. Réfléchissez à la facilité avec laquelle une telle fonctionnalité pourrait être utilisée par des logiciels malveillants. Vous pouvez écouter les intentions qui vous sont adressées et celles qui sont diffusées, mais le lancement d’une application ne doit pas être un événement de diffusion.

Ce que vous pourrez peut-être faire est remplacez le lanceur . Si l'utilisateur y consent.

12
Pontus Gagge
class CheckRunningActivity extends Thread{
    ActivityManager am = null;
    Context context = null;

    public CheckRunningActivity(Context con){
        context = con;
        am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    public void run(){
        Looper.prepare();

        while(true){
            // Return a list of the tasks that are currently running,
            // with the most recent being first and older ones after in order.
            // Taken 1 inside getRunningTasks method means want to take only
            // top activity from stack and forgot the olders.
            List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

            String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();

            if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
                // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
            }
        }
        Looper.loop();
    }
}

Vous pouvez obtenir le fonctionnement actuel de Activity et vérifier si cette Activity correspond à l'application Email.

Exécutez CheckRunningActivityThread sur Application start (ou au démarrage du périphérique).

new CheckRunningActivity().start();

Mise à jour: Cette classe a besoin de Android.permission.GET_TASKS _ permission, ajoutez donc la ligne suivante au manifeste:

<uses-permission Android:name="Android.permission.GET_TASKS" />
12
Veaceslav Gaidarji

Le problème principal est que vous essayez d'écouter les intentions implicites lorsque le programme de lancement (écran d'accueil) utilise généralement des intentions explicites.

Une intention implicite consiste à dire "Quelqu'un joue cette vidéo" et Android choisit une application capable de gérer cette intention.

Une intention explicite est ce qui se passe lorsque vous cliquez sur l'icône "Email" sur l'écran d'accueil. Il indique spécifiquement à Android d'ouvrir cette application spécifique par nom complet (par exemple, com.Android.mail ou quelque chose du genre).

AFAIK n’a aucun moyen d’intercepter de telles intentions explicites. Il s'agit d'une mesure de sécurité intégrée à Android). Aucune activité ne peut avoir le même nom de package complet. Cela empêche une tierce partie de cloner l'application et de la faire passer pour cette application. Si ce que vous souhaitez était possible, vous pourriez théoriquement installer une application capable d'empêcher toutes les applications de vos concurrents de fonctionner.

Ce que vous essayez de faire va à l’encontre du modèle de sécurité Android).

Vous pouvez par exemple créer un partenariat avec des développeurs d’applications spécifiques pour transmettre les intentions à votre système de sécurité, mais ce n’est probablement pas une question à traiter.

10
CodeFusionMobile

getRunningTasks() est obsolète dans Android L.

Pour obtenir des statistiques d'utilisation de l'application, vous pouvez utiliser le package sageStats de Android.app.usage .

La nouvelle API de statistiques d'utilisation des applications permet aux développeurs d'applications de collecter des statistiques relatives à l'utilisation des applications. Cette API fournit des informations d'utilisation plus détaillées que la méthode obsolète getRecentTasks ().

Pour utiliser cette API, vous devez d’abord déclarer le Android.permission.PACKAGE_USAGE_STATS _ permission dans votre manifeste. L'utilisateur doit également activer l'accès à cette application via Settings > Security > Apps with usage access.

Here est un exemple d'application de base montrant comment utiliser l'API de statistiques d'utilisation de l'application pour permettre aux utilisateurs de collecter des statistiques relatives à l'utilisation des applications.

7
Plo_Koon

Peut-être avez-vous besoin d'un service, quelque chose qui fonctionnera constamment en arrière-plan. Que votre service fasse ce que vous avez dit. Écoutez le fichier Android.intent.action.MAIN également dans la catégorie Android.intent.category.LAUNCHER. Ensuite, demandez à ce récepteur de diffusion de remplacer la méthode onReceive et vérifiez le nom de l'application, etc.

3
Jacob Malliet