
Jan
Ich versuche, eine App zu entwickeln, die verhindert, dass ein Benutzer ohne Passwort zu einer bestimmten App gelangt. Das Szenario ist…
- Benutzer klickt auf die App „E-Mail“ (z. B.)
- 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 darüber und fragt nach einem Passwort
- 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

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.
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.

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 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.

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.

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.
9637400cookie-checkAndroid, Erkennen, wenn andere Apps gestartet werdenyes
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