Android, detecteren wanneer andere apps worden gestart

Ik probeer een app te ontwikkelen die voorkomt dat een gebruiker zonder wachtwoord naar een bepaalde app gaat. Het scenario is…

  1. gebruiker klikt op app “E-mail” (bijvoorbeeld)
  2. mijn app detecteert de lancering van een app
  3. mijn app bevestigt dat het de app “E-mail” is
  4. mijn app opent een view over the top en vraagt ​​om een ​​wachtwoord
  5. gebruiker voert een wachtwoord in, indien correct, mijn app verdwijnt en laat de app “E-mail” bovenaan

De rest vind ik oké, alleen deel 2 stelt me ​​een raadsel, en na vele dagen lezen over Broadcast Intents enz. en proberen te luisteren naar “android.intent.action.MAIN” enz. in mijn proefprojecten heb ik kan niet detecteren wanneer een andere app dan de mijne wordt gestart.

Kan iemand helpen? Ga ik er op de juiste manier mee om, bij het zoeken naar nieuwe apps die een intentie om te starten uitzenden, of moet ik het systeemlogboek lezen voor nieuwe bedoelingen, of iets in native code doen?

Alle tips zouden helpen, zelfs als je het niet volledig kunt beantwoorden, kan ik wat meer onderzoek doen. Hartelijk bedankt. Ian


Antwoord 1, autoriteit 100%

Ik denk dat we logcatkunnen gebruiken en de uitvoer ervan kunnen analyseren.

In alle vergelijkbare programma’s heb ik deze toestemming gevonden:

android.permission.READ_LOGS

Het betekent dat ze het allemaal gebruiken, maar het lijkt erop dat het programma start en daarna zal ons programma (app-beschermer) starten en naar voren komen.

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

En vergeet niet om de toestemming toe te voegen aan het manifestbestand.


Antwoord 2, autoriteit 62%

Een gimmicky manier om dit te doen is om een ​​service te hebben met een getimede lus die controleert

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

Je doorloopt die lijst om te kijken wat er op de telefoon draait.
Nu kun je ze identificeren met id’s en processName, dus voor standaardactiviteiten is dit gemakkelijk voor aangepaste, tenzij je ze allemaal stopt, het is moeilijk te onderscheiden…

Opmerking:dit is geen lijst van wat er daadwerkelijk op het scherm staat, alleen een lijst van wat er wordt uitgevoerd… een beetje je doel teniet doend misschien, maar je weet tenminste wanneer iets begint te uitvoeren… het blijft in die lijst staan, zelfs als het op de achtergrond is.

Voor het wachtwoord kun je gewoon je activiteit starten als je een app hebt gevonden
dat is beschermd of wat dan ook.


Antwoord 3, autoriteit 38%

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

Je kunt de huidige lopende Activitykrijgen en controleren of deze Activityovereenkomt met de Emailapplicatie.

Voer CheckRunningActivityThreaduit bij het starten van Application(of bij het opstarten van het apparaat).

new CheckRunningActivity().start();

Bijwerken:
Deze klasse heeft android.permission.GET_TASKStoestemming nodig, dus voeg de volgende regel toe aan het manifest:

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

Antwoord 4, autoriteit 35%

Ik denk en hoop dat dit niet mogelijk is. Bedenk hoe gemakkelijk dergelijke functionaliteit kan worden misbruikt door schadelijke software. U kunt luisteren naar intenties die op u gericht zijn, en degenen die worden uitgezonden, maar het starten van een applicatie mag geen uitzendingsgebeurtenis zijn.

Wat u mogelijk kunt doen, is het opstartprogramma vervangen. Als de gebruiker ermee instemt.


Antwoord 5, autoriteit 32%

Het belangrijkste probleem is dat u probeert te luisteren naar impliciete bedoelingen terwijl de Launcher (startscherm) doorgaans expliciete bedoelingen gebruikt.

Een impliciete bedoeling is wanneer je wilt zeggen “Iemand speelt deze video af” en Android kiest een app die die bedoeling aankan.

Een expliciete bedoeling is wat er gebeurt wanneer u op het pictogram ‘E-mail’ op het startscherm klikt. Het vertelt Android specifiek om die specifieke app te openen met een volledig gekwalificeerde naam (d.w.z. com.android.mail of iets dergelijks).

Er is geen manier waarop AFAIK zulke expliciete bedoelingen kan onderscheppen. Het is een in Android ingebouwde beveiligingsmaatregel dat geen twee activiteiten dezelfde volledig gekwalificeerde pakketnaam kunnen hebben. Dit voorkomt dat een derde partij de app kloont en zich voordoet als die app. Als wat je wilde doen mogelijk was, zou je in theorie een app kunnen installeren die zou kunnen voorkomen dat alle apps van je concurrentie werken.

Wat u probeert te doen druist in tegen het Android-beveiligingsmodel.

Eén ding dat u zou kunnen doen, is samenwerken met specifieke app-ontwikkelaars om de intenties door te sturen naar uw beveiligingssysteem, maar dat is waarschijnlijk niet iets waar u mee te maken wilt hebben.


Antwoord 6, autoriteit 21%

getRunningTasks()is verouderd in Android L.

Als u statistieken over app-gebruik wilt verkrijgen, kunt u de klasse UsageStatsgebruiken uit het pakket android.app.usage-pakket.

Met de nieuwe API voor app-gebruiksstatistieken kunnen app-ontwikkelaars statistieken verzamelen over het gebruik van de applicaties. Deze API biedt meer gedetailleerde gebruiksinformatie dan de verouderde getRecentTasks()-methode.

Als u deze API wilt gebruiken, moet u eerst de toestemming android.permission.PACKAGE_USAGE_STATSin uw manifest aangeven. De gebruiker moet ook toegang voor deze app inschakelen via Settings > Security > Apps with usage access.

Hieris een eenvoudig app-voorbeeld dat laat zien hoe u de API voor app-gebruiksstatistieken gebruikt om gebruikers te laten verzamelen statistieken met betrekking tot het gebruik van de applicaties.


Antwoord 7, autoriteit 12%

Misschien heb je een service nodig, iets dat constant op de achtergrond draait. Laat uw dienst dan doen wat u zei. Luister naar de android.intent.action.MAIN ook met de categorie android.intent.category.LAUNCHER. Laat die broadcast-ontvanger vervolgens de onReceive-methode overschrijven en controleer de naam van de applicatie enz.

Other episodes