Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android 6.0 Marshmallow UsageStatsManager issue when trying to retrieve foreground app

whenever I try to query the Usage Stats of the UsageStatsManager I can correctly get the last running app. However, if I pull down the status bar and there is a new notification, the last used app (based on UsageStats) will change to that of the notification. As a result, I get false alarms that the foreground application has changed.

I can't seem to find a way to filter those specific draws. Any ideas?

Right now, I query for the foreground app with the following code. The problem exists only in Marshmallow (5.X works correctly).

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();
} 
}
like image 950
fcdimitr Avatar asked Oct 23 '15 16:10

fcdimitr


3 Answers

You can query the usageEvent to check if the last active app's event is UsageEvents.Event.MOVE_TO_FOREGROUND.

After you get the foregroundApp, you can refer to the following code:

 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 ;
 }
like image 79
Lingkun Kong Avatar answered Nov 18 '22 14:11

Lingkun Kong


In android 6.0 os, getUsageStats function giving list size zero. For confirmation, you can check any lock app from play store. Those app are not working in android 6.0.

like image 38
d.k. Avatar answered Nov 18 '22 14:11

d.k.


Take a look at https://github.com/ricvalerio/foregroundappchecker, it might be what you need. Provides sample code, and takes away the pain of having to implement cross version foreground detector.

like image 29
rvalerio Avatar answered Nov 18 '22 15:11

rvalerio