Lollipopになって、privacyについて強化するためかActivityManagerのgetRunningTasksやgetRecentTasksはdeprecatedとなりました。
非推奨なだけでなく挙動も変わってます。
現状の挙動は結果は返却されますが、 そのメソッドを呼んだアプリ自身もしくはランチャーアプリの情報しか帰ってこないようになっています。
今回はその代替手段について調べてみました。
UsageStatsManagerを使う
UsageStatsManagerのqueryEventsを使って得られるUsageEventsから、各アプリがforegroundもしくはbackgroundになったときのtimestamp、classNameが取得できます。
UsageStatsManager stats = (UsageStatsManager) getSystemService("usagestats");
UsageEvents usageEvents = stats.queryEvents(start, end);
while (usageEvents.hasNextEvent()) {
UsageEvents.Event event = new android.app.usage.UsageEvents.Event();
usageEvents.getNextEvent(event);
long timestamp = event.getTimeStamp();
String packagName = event.getPackageName();
String className = event.getClassName();
int type = event.getEventType();
:
}
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
ただ、このままするといくらやっても、 usageEvents.hasNextEvent() は常にfalseを返してきます。
これを解消するには 設定->セキュリティー->使用履歴にアクセスできるアプリ にて自分のアプリをONにしてもらう必要があります
これをONにすることでUsagEventsを取得する事ができるようになります。
ちなみにアプリからこの画面にぶっ飛ばすには下記コードで大丈夫です
startActivity(new Intent("android.settings.USAGE_ACCESS_SETTINGS"));
現状調査した範囲では、自分のアプリが取得可能な状態になっているかを判断するには一度「UsageStatsManagerで取得してみる」というしかないようです。
他に方法を見つけたら追記します。
自分のアプリが取得可能な状態になっているかどうかは、下記コードで確認可能のようです!
public boolean isUsageStatsAllowed() {
AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int uid = android.os.Process.myUid();
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, uid, getPackageName());
return mode == AppOpsManager.MODE_ALLOWED;
}