2015-10-23 15 views
20

abrufen, wenn ich versuche, die Nutzungsstatistik der UsageStatsManager Abfrage Ich kann die letzte laufende App korrekt abrufen. Wenn ich jedoch die Statusleiste herunter ziehe und eine neue Benachrichtigung erscheint, wird die zuletzt verwendete App (basierend auf UsageStats) auf die der Benachrichtigung geändert. Als Ergebnis bekomme ich falsche Alarme, dass sich die Vordergrundanwendung geändert hat.Android 6.0 Marshmallow UsageStatsManager Problem beim Versuch, Vordergrund App

Ich kann nicht scheinen, einen Weg zu finden, diese spezifischen Züge zu filtern. Irgendwelche Ideen?

Im Moment frage ich nach der Vordergrund-App mit dem folgenden Code. Das Problem besteht nur in Marshmallow (5.X funktioniert ordnungsgemäß).

UsageStatsManager mUsageStatsManager = (UsageStatsManager) rotationManager.getSystemService("usagestats"); 
long time = System.currentTimeMillis(); 
// We get usage stats for the last 10 seconds 
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 2, time); 
// 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()) { 
    foregroundApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 
} 
} 
+0

Werfen Sie einen Blick auf https://github.com/ricvalerio/foregroundappchecker, es könnte sein, was Sie brauchen. – rvalerio

Antwort

9

Sie können das usageEvent abfragen, um zu überprüfen, ob das Ereignis der letzten aktiven Anwendung UsageEvents.Event.MOVE_TO_FOREGROUND ist.

Nachdem Sie die foregroundApp erhalten, können Sie auf den folgenden Code verweisen:

UsageEvents usageEvents = mUsageStatsManager.queryEvents(time - 100 * 1000, time); 
UsageEvents.Event event = new UsageEvents.Event(); 
// get last event 
while (usageEvent.hasNextEvent()) { 
    usageEvent.getNextEvent(event); 
} 
if (foregroundApp.equals(event.getPackageName()) && event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { 
    return foregroundApp ; 
} 
+1

Vielen Dank! Dies löst das Problem für den Moment ... bis Google sich entscheidet, es wieder zu ändern:) ... – fcdimitr

+0

Ein sehr großes Dankeschön für diese Antwort. Ich suche das seit vielen Tagen. nochmals vielen dank das es sehr gut funktioniert. :) – WonderSoftwares

+1

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

3

In Android 6.0 os, GetUsageStats Funktion geben Liste Größe Null. Zur Bestätigung können Sie jede Lock-App im Play Store überprüfen. Diese App funktioniert nicht in Android 6.0.

+0

Ich überprüfe, dass es in einigen Geräten wie micro max nicht funktioniert. Kannst du beschreiben, was es heißt, einen Fehlalarm zu bekommen? –

+0

getUsageStats gibt tatsächlich die zuletzt verwendeten Anwendungen zurück, gibt aber auch die letzte App zurück, die in der Statusleiste angezeigt wurde, auch ohne sie zu öffnen. Deshalb sage ich Fehlalarm, weil es besagt, dass sich die Front-App geändert hat, während sie gleich geblieben ist. – fcdimitr

+0

haben Sie die zuletzt verwendete Zeit der Anwendungen überprüft, die oben liegen. Weil ich in Marshmallow sehe, geben diese API immer einige Anwendungen Liste mit zuletzt verwendeten Null. Ignorieren Sie daher diese Anwendung mit der zuletzt verwendeten Nullzeit und überprüfen Sie sie mit Nicht-Null-Zeitwerten. Von der Liste der nicht zuletzt verwendeten Listen erhalten Sie Ihre Bewerbung. Lass es mich wissen, es hat dein Problem gelöst? –

Verwandte Themen