Android, Erkennen, wenn andere Apps gestartet werden

Lesezeit: 8 Minuten

Android Erkennen wenn andere Apps gestartet werden
Jan

Ich versuche, eine App zu entwickeln, die verhindert, dass ein Benutzer ohne Passwort zu einer bestimmten App gelangt. Das Szenario ist…

  1. Benutzer klickt auf die App „E-Mail“ (z. B.)
  2. Meine App erkennt den Start einer App
  3. Meine App bestätigt, dass es sich um die “E-Mail”-App handelt
  4. Meine App öffnet eine Ansicht darüber und fragt nach einem Passwort
  5. Benutzer gibt ein Passwort ein, wenn es korrekt ist, verschwindet meine App und lässt die “E-Mail”-App oben

Ich mache den Rest gut, nur Teil 2 verwirrt mich, und nach vielen Tagen des Lesens über Broadcast Intents usw. und des Versuchs, in meinen Testprojekten auf “android.intent.action.MAIN” usw. zu hören, kann ich es nicht scheinen zu erkennen, wenn eine andere App als meine gestartet wird.

Kann jemand helfen? Gehe ich richtig vor, indem ich nach neuen Apps suche, die eine Startabsicht senden, oder sollte ich das Systemprotokoll nach neuen Absichten lesen oder etwas im nativen Code tun?

Jeder Hinweis würde helfen, auch wenn Sie es nicht vollständig beantworten können, kann ich weitere Nachforschungen anstellen. Vielen Dank. Jan

  • Ich bin mir nicht sicher, wie sie es gemacht haben, aber Apps mögen App-Schutz tut genau das, wonach Sie fragen, also ist es tatsächlich technisch möglich.

    – Hanspeide

    20. Juli 2010 um 19:23 Uhr

  • @lan wie hast du dein problem gelöst kannst du bitte dein wissen teilen

    – nida

    16. Januar 2015 um 5:11 Uhr

  • hallo hast du die lösung

    – ask4solutions

    24. Februar 2016 um 6:26 Uhr

Android Erkennen wenn andere Apps gestartet werden
M. Movaffagh

Ich denke, wir können verwenden logcat und analysieren Sie die Ausgabe.

In allen ähnlichen Programmen habe ich diese Berechtigung gefunden:

android.permission.READ_LOGS

Es bedeutet, dass alle es verwenden, aber es scheint, dass das Programm startet und danach unser Programm (App-Schutz) startet und nach vorne bringt.

Verwenden Sie den folgenden Code:

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

Und vergessen Sie nicht, die Berechtigung in der Manifest-Datei hinzuzufügen.

  • Bitte, wo müssen wir diesen Code eingeben? in einem Dienst? im onStartCommand()?

    – haythem souissi

    30. Mai 2012 um 1:22 Uhr

  • funktioniert nicht von JellyBean und höher. Die READ_LOGS-Berechtigung ist jetzt nur für System-Apps reserviert.

    – rannte

    14. Juli 2012 um 13:18 Uhr

  • Bist du dir da absolut sicher? Denn Smart AppLock scheint dies auch auf JB-Geräten zu können. Liegt es daran, dass sich die Anwendung zum Geräteadministrator erhebt? play.google.com/store/apps/…

    – Karthik Balakrishnan

    16. Mai 2013 um 18:48 Uhr


  • @Torcellite, diese App verfügt über die Berechtigung “Aufgaben zum Ausführen abrufen”, sodass möglicherweise stattdessen diese Technik verwendet wird.

    – Sam

    27. April 2015 um 9:30 Uhr

  • @Ran, also was ist zu tun, um es jetzt zu verwenden … gibt es jetzt eine Lösung, um das in der Frage angegebene Problem zu lösen, da ich über Jelly Beans sein muss … bitte geben Sie Ihr Feedback so schnell wie möglich …

    – Shreyan Mehta

    24. April 2017 um 14:46 Uhr

Eine knifflige Art, dies zu tun, besteht darin, einen Dienst mit einer zeitgesteuerten Schleife zu haben, die dies überprüft

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

Sie gehen diese Liste durch, um zu sehen, was auf dem Telefon läuft. Jetzt können Sie sie mit IDs und ProcessName identifizieren, also ist dies für Standardaktivitäten für benutzerdefinierte Aktivitäten einfach, es sei denn, Sie stoppen sie alle, es ist schwer zu unterscheiden …

Notiz: Dies ist keine Liste dessen, was tatsächlich auf dem Bildschirm angezeigt wird, sondern nur eine Liste dessen, was gerade ausgeführt wird … Ihr Ziel wird vielleicht irgendwie zunichte gemacht, aber zumindest wissen Sie, wann etwas zu laufen beginnt … es wird sogar in dieser Liste bleiben wenn im Hintergrund aber.

Was das Passwort betrifft, können Sie Ihre Aktivität einfach starten, wenn Sie eine geschützte App oder was auch immer gefunden haben.

  • Ist es möglich, die Zeit zu erhalten, zu der die App gestartet/wieder aufgenommen wurde?

    – 0LLiena

    17. Juli 2014 um 20:44 Uhr

  • In Android L verwenden android.app.usage Paket statt. developer.android.com/reference/android/app/usage/…

    – Plo_Koon

    6. September 2015 um 13:37 Uhr

1646635995 338 Android Erkennen wenn andere Apps gestartet werden
Weaceslav Gaidarji

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

Sie können Strom zum Laufen bringen Activity und überprüfen Sie, ob dies Activity entspricht Email Anwendung.

Laufen CheckRunningActivity Thread an Application start (oder beim Gerätestart).

new CheckRunningActivity().start();

Aktualisieren:
Diese Klasse braucht android.permission.GET_TASKS Berechtigung, also fügen Sie die nächste Zeile zum Manifest hinzu:

<uses-permission android:name="android.permission.GET_TASKS" />

  • Ich verwende diesen Ansatz, aber dadurch wird Ihr “// show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME” aufgrund einer Schleife immer wieder geöffnet. Irgendeine Problemumgehung dafür?

    – Anuj Sharma

    18. Juli 2014 um 9:08 Uhr

  • Stoppen Sie den CheckRunningActivity-Thread, wenn Sie das gewünschte Ergebnis erhalten

    – Veaceslav Gaidarji

    18. Juli 2014 um 9:14 Uhr

  • Danke für die Antwort, wie/wann wird dieser Thread dann wieder neu gestartet? Ich verwende einen Sticky Service.

    – Anuj Sharma

    18. Juli 2014 um 9:17 Uhr


  • hängt vom Kontext des Problems ab, beschreiben Sie bitte genauer, was Sie erhalten möchten.

    – Veaceslav Gaidarji

    18. Juli 2014 um 9:21 Uhr

  • In Ihrem Code hier, die Looper.loop() -Anweisung sieht so aus, als würde sie aufgrund von nie ausgeführt werden while(true) Schleife endet nie. Ist das ein Fehler?

    – Sam

    31. Oktober 2014 um 10:07 Uhr

Ich denke und hoffe, dass dies nicht möglich ist. Überlegen Sie, wie leicht solche Funktionen von bösartiger Software missbraucht werden könnten. Sie können Absichten hören, die an Sie gerichtet sind, und solche, die übertragen werden, aber das Starten von Anwendungen sollte kein Übertragungsereignis sein.

Was Sie möglicherweise tun können, ist Ersetzen Sie den Launcher. Wenn der Benutzer damit einverstanden ist.

Das Hauptproblem besteht darin, dass Sie versuchen, auf implizite Absichten zu lauschen, wenn der Launcher (Startbildschirm) normalerweise explizite Absichten verwendet.

Eine implizite Absicht liegt vor, wenn Sie sagen möchten „Jemand spielt dieses Video ab“ und Android eine App auswählt, die diese Absicht verarbeiten kann.

Eine explizite Absicht ist das, was passiert, wenn Sie auf dem Startbildschirm auf das Symbol „E-Mail“ klicken. Es weist Android ausdrücklich an, diese bestimmte App mit dem vollständig qualifizierten Namen (z. B. com.android.mail oder so) zu öffnen.

AFAIK hat keine Möglichkeit, solche expliziten Absichten abzufangen. Es ist eine in Android integrierte Sicherheitsmaßnahme, dass keine zwei Aktivitäten denselben vollständig qualifizierten Paketnamen haben können. Dadurch wird verhindert, dass Dritte die App klonen und sich als diese App ausgeben. Wenn das, was Sie tun möchten, möglich wäre, könnten Sie theoretisch eine App installieren, die alle Apps Ihrer Konkurrenz blockieren könnte.

Was Sie zu tun versuchen, verstößt gegen das Android-Sicherheitsmodell.

Eine Sache, die Sie tun könnten, wäre, mit bestimmten App-Entwicklern zusammenzuarbeiten, um die Absichten an Ihr Sicherheitssystem weiterzuleiten, aber das ist wahrscheinlich nichts, womit Sie sich befassen möchten.

Android Erkennen wenn andere Apps gestartet werden
Gemeinschaft

getRunningTasks() ist in Android L veraltet.

Um App-Nutzungsstatistiken zu erhalten, können Sie verwenden Nutzungsstatistik Klasse ab android.app.usage Paket.

Die neue App-Nutzungsstatistik-API ermöglicht es App-Entwicklern, Statistiken zur Nutzung der Anwendungen zu sammeln. Diese API bietet detailliertere Nutzungsinformationen als die veraltete Methode getRecentTasks().

Um diese API zu verwenden, müssen Sie zunächst die deklarieren android.permission.PACKAGE_USAGE_STATS Erlaubnis in Ihrem Manifest. Der Benutzer muss auch den Zugriff für diese App durch aktivieren Settings > Security > Apps with usage access.

Hier ist ein einfaches App-Beispiel, das zeigt, wie die App-Nutzungsstatistik-API verwendet wird, damit Benutzer Statistiken zur Nutzung der Anwendungen sammeln können.

1646635997 517 Android Erkennen wenn andere Apps gestartet werden
Jakob Malliet

Vielleicht brauchen Sie einen Dienst, etwas, das ständig im Hintergrund läuft. Dann lass deinen Service tun, was du gesagt hast. Hören Sie sich die android.intent.action.MAIN auch mit der Kategorie android.intent.category.LAUNCHER an. Lassen Sie dann diesen Broadcast-Empfänger die onReceive-Methode überschreiben und prüfen Sie, ob der Name der Anwendung usw. angezeigt wird.

  • Das hört sich nach genau der Methode an, an die ich gedacht habe, aber ich habe Probleme, die MAIN-Sendung (Kat. LAUNCHER) mit einem einfachen BroadcastReceiver zu empfangen. Hat das schon mal jemand hinbekommen? In diesem Stadium möchte ich nur feststellen, ob eine Anwendung gestartet oder fortgesetzt wurde. Ich kann dann den Paketnamen mit einer Zeichenfolge vergleichen, die die gesuchten Namen enthält.

    – Jan

    21. Juli 2010 um 13:47 Uhr

963740cookie-checkAndroid, Erkennen, wenn andere Apps gestartet werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy