Ich versuche, eine App zu entwickeln, die verhindert, dass ein Benutzer ohne Kennwort zu einer bestimmten App gelangt. Das Szenario ist ...
- Benutzer klickt auf "E-Mail" App (zum Beispiel)
- Meine App erkennt den Start einer App
- Meine App bestätigt, dass es sich um die "E-Mail" -App handelt
- Meine App öffnet eine Ansicht von oben und fragt nach einem Passwort
- Der Benutzer gibt ein Passwort ein. Wenn dies korrekt ist, verschwindet meine App und die App "E-Mail" bleibt oben
Ich mache den Rest in Ordnung, nur Teil 2 verwirrt mich und nach vielen Tagen, in denen ich mich über Broadcast Intents usw. informiert und versucht habe, in meinen Testprojekten auf "android.intent.action.MAIN" usw. zu hören, kann ich nicht scheinen zu erkennen, wann eine andere App als meine gestartet wird.
Kann jemand helfen? Gehe ich richtig vor, wenn ich nach neuen Apps suche, die eine Startabsicht senden, oder sollte ich das Systemprotokoll auf neue Absichten lesen oder etwas in nativem Code tun?
Alle Hinweise würden helfen, auch wenn Sie sie nicht vollständig beantworten können, kann ich weitere Nachforschungen anstellen. Vielen Dank. Ian
Antworten:
Ich denke, wir können
logcat
die Ausgabe verwenden und analysieren.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 Protector) startet und nach vorne bringt.
Verwenden Sie den folgenden Code:
Und vergessen Sie nicht, die Berechtigung in die Manifest-Datei einzufügen.
quelle
Eine spielerische Möglichkeit, dies zu tun, besteht darin, einen Dienst mit einer Zeitschleife zu haben, die dies überprüft
Sie durchlaufen diese Liste, um zu sehen, was auf dem Telefon ausgeführt wird. Jetzt können Sie sie mit IDs und processName identifizieren. Für Standardaktivitäten ist dies für benutzerdefinierte Aktivitäten also einfach, es sei denn, Sie stoppen sie alle, es ist schwer zu unterscheiden ...
Hinweis: Dies ist keine Liste der Dinge, die tatsächlich auf dem Bildschirm angezeigt werden, sondern nur eine Liste der Dinge, die gerade ausgeführt werden. Vielleicht wird Ihr Ziel irgendwie zunichte gemacht, aber zumindest werden Sie wissen, wann etwas zu laufen beginnt Liste auch im Hintergrund.
Für das Passwort können Sie Ihre Aktivität einfach starten, wenn Sie eine App gefunden haben, die geschützt ist oder was auch immer.
quelle
android.app.usage
stattdessen das Paket. developer.android.com/reference/android/app/usage/…Ich denke und hoffe, dass dies nicht möglich ist. Überlegen Sie, wie leicht solche Funktionen von schädlicher Software missbraucht werden können. Sie können sich die an Sie gerichteten und die gesendeten Absichten anhören, aber das Starten der Anwendung sollte kein Sendeereignis sein.
Möglicherweise können Sie den Launcher ersetzen . Wenn der Benutzer damit einverstanden ist.
quelle
Sie können den aktuellen Status
Activity
aktivieren und prüfen, ob diesActivity
derEmail
Anwendung entspricht.Führen Sie
CheckRunningActivity
Thread
aufApplication
Start (oder auf dem Gerät boot).Update: Diese Klasse benötigt eine
android.permission.GET_TASKS
Berechtigung. Fügen Sie daher die nächste Zeile zum Manifest hinzu:quelle
Looper.loop()
sieht die Anweisung so aus, als würde sie niemals ausgeführt, da diewhile(true)
Schleife niemals beendet wird. Ist das ein Fehler?Das Hauptproblem besteht darin, dass Sie versuchen, auf implizite Absichten zu achten, wenn der Launcher (Startbildschirm) normalerweise explizite Absichten verwendet.
Eine implizite Absicht ist, wenn Sie "Jemand spielt dieses Video ab" sagen möchten und Android eine App auswählt, die diese Absicht verarbeiten kann.
Eine explizite Absicht ist, was passiert, wenn Sie auf dem Startbildschirm auf das Symbol "E-Mail" klicken. Es weist Android ausdrücklich an, diese bestimmte App unter einem vollständig qualifizierten Namen (z. B. com.android.mail oder so) zu öffnen.
Es gibt keine Möglichkeit für AFAIK, 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. Dies verhindert, dass Dritte die App klonen und sich als diese App tarnen. Wenn das, was Sie tun möchten, möglich wäre, könnten Sie theoretisch eine App installieren, die die Funktion aller Apps Ihrer Konkurrenz blockiert.
Was Sie versuchen, widerspricht dem Android-Sicherheitsmodell.
Eine Sache, die Sie tun können, ist, mit bestimmten App-Entwicklern zusammenzuarbeiten, um die Absichten an Ihr Sicherheitssystem weiterzuleiten, aber damit möchten Sie sich wahrscheinlich nicht befassen.
quelle
getRunningTasks()
ist in Android L veraltet.Um App-Nutzungsstatistiken zu erhalten, können Sie die UsageStats- Klasse aus dem android.app.usage- Paket verwenden.
Mit der neuen API für App-Nutzungsstatistiken können App-Entwickler Statistiken zur Nutzung der Anwendungen sammeln. Diese API bietet detailliertere Verwendungsinformationen als die veraltete Methode getRecentTasks ().
Um diese API verwenden zu können, müssen Sie zuerst die
android.permission.PACKAGE_USAGE_STATS
Berechtigung in Ihrem Manifest deklarieren . Der Benutzer muss auch den Zugriff für diese App über aktivierenSettings > Security > Apps with usage access
.Hier ist ein grundlegendes App-Beispiel, das zeigt, wie die App-Nutzungsstatistik-API verwendet wird, damit Benutzer Statistiken zur Nutzung der Anwendungen sammeln können.
quelle
Vielleicht brauchen Sie einen Dienst, der ständig im Hintergrund läuft. Dann lassen Sie Ihren Dienst tun, was Sie gesagt haben. Hören Sie auf die android.intent.action.MAIN auch mit der Kategorie android.intent.category.LAUNCHER. Lassen Sie dann diesen Broadcast-Empfänger die onReceive-Methode überschreiben und überprüfen Sie, ob der Name der Anwendung usw. angezeigt wird.
quelle