59
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

【Android】getRunningTasksが使えなくなったLollipopでアプリ使用状況を取得する

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();
        :
    }
AndroidManifest.xml
<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;
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
59
Help us understand the problem. What are the problem?