0

Ich wurde zuvor Android-Anwendung für App-Sperre entwickelt, die auf Idee des laufenden laufenden Prozesses Paketname für beide unter Lollipop und über Lollipop-Versionen ausgeführt wird. Aber jetzt in Marshmallow gibt es ein Problem, den richtigen Paketnamen aufgrund von Benachrichtigungen zu erhalten. Ja, als die Benachrichtigung kam, wurde der Paketname des aktuell ausgeführten Prozesses in den Namen des Apps-Pakets geändert, von dem die Benachrichtigung kam. Kurz gesagt, wenn ich Messenger bin und plötzlich die WhatsApp-Benachrichtigung kam und der Paketname des obersten laufenden Prozesses com.whatsapp lautet. und meine App-Sperre wird geöffnet. Ich bin mit diesen Methoden laufenden Anwendung des Paketnamen zu erhalten:UsageStatsManager Start Rückkehr Paketname von neuen Benachrichtigung und nicht laufenden

// API below 21 
@SuppressWarnings("deprecation") 
public static String getProcessOld(Context c) throws Exception { 
    String topPackageName = null; 
    ActivityManager activity = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> runningTask = activity.getRunningTasks(1); 
    if (runningTask != null) { 
     RunningTaskInfo taskTop = runningTask.get(0); 
     ComponentName componentTop = taskTop.topActivity; 
     topPackageName = componentTop.getPackageName(); 
    } 
    return topPackageName; 
} 

// API 21 and above 
@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public static String getProcessNew(Context c) throws Exception { 
    String st = null; 
    try { 
     // st = getProcess(); 
     UsageStatsManager mUsageStatsManager = (UsageStatsManager) c.getSystemService("usagestats"); 
     long endTime = System.currentTimeMillis(); 
     long beginTime = endTime - 1000 * 10; 

     // We get usage stats for the last minute 
     List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, 
       endTime); 

     // Sort the stats by the last time used 
     if (stats != null) { 
      SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); 
      for (UsageStats usageStats : stats) { 
       mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); 
      } 
      if (mySortedMap != null && !mySortedMap.isEmpty()) { 
       st = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 

      } 
     } 

    } catch (Exception e) { 
     Log.d("main", "Wxxxxexx " + e); 

    } 
    return st; 
} 

Gibt es eine Methode, wie kann ich nur Paketnamen erhalten Anwendungs ​​auf der Benutzeroberfläche ausgeführt wird oder von der Kennzeichnungspflicht filtern und entfernen. Dieses Problem tritt nur von Marshmallow auf.

+0

Haben Sie über die Berechtigung zum Lesen von Benachrichtigungen gedacht? – JacksOnF1re

Antwort

2

Statt queryUsageStats zu verwenden, Sie queryEvents und nehmen Sie die letzte Ereignis des Typs UsageEvents.Event.MOVE_TO_FOREGROUND hier vorgeschlagen, aber https://stackoverflow.com/a/33748047

Die Events sind bereits sortiert nutzen könnten, um sicherzustellen, dass Sie auch den Zeitstempel zugreifen können.

Ich habe es ausprobiert und es scheint zu funktionieren wie erwartet.

+0

Lösung funktioniert, aber es gibt wenig Problem. Das Vordergrund-App-Paket erkennt nach 3 Sekunden Verzögerung in Marshmallow. Beim Debuggen gibt queryUsageStats schnelle Paketinformationen und danach queryEvents 3 Sekunden zurück, um das korrekte Paket im Vordergrund zu erhalten. – WonderSoftwares