UsageStatsManagerの権限確認
UsageStatsManagerは、Lollipop以降でActivityManagerのgetRunningTasksなどの各種メソッドの代替として提供されているAPIです。
Manifestへに権限(android.permission.PACKAGE_USAGE_STATS)を定義する他に、ユーザによる権限付与が必要なのですが、その確認方法をメモしておきます。
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static boolean checkPermission(Context context) {
// Lollipop以前は使えないAPIが含まれています。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
return false;
// AppOpsManagerを取得
AppOpsManager aom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
// GET_USAGE_STATSのステータスを取得
int mode = aom.checkOp(AppOpsManager.OPSTR_GET_USAGE_STATS, Process.myUid(),
context.getPackageName());
LogUtil.d(TAG, "check:" + mode);
if (mode == AppOpsManager.MODE_DEFAULT) {
// AppOpsの状態がデフォルトなら通常のpermissionチェックを行う。
// 普通のアプリならfalse
return context.checkPermission("android.permission.PACKAGE_USAGE_STATS",
Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED;
}
// AppOpsの状態がデフォルトでないならallowedのみtrue
return mode == AppOpsManager.MODE_ALLOWED;
}
調べたのはUsageStatsManagerの実装部分のUsageStatsServiceのメソッドです。
UsageStatsService.BinderService.hasPermission
AppOpsManagaer自体はAPI19からアクセス可能みたいです。
Runtime-Permissionと別に管理されているようですね。
上記確認方法はAndroid 6.0 Preview(MPA44G)でも使用可能でした。
#おまけ:ActivityManager.getRunningAppProcessesなどの現状
Lollipop以前と以後
Android5.0以前ではActivityのスタックの状況やプロセスなど、ActivityManagerのgetRunningTasksやgetRecentTasks、getRunningAppProcessesで取得することができました。
しかもgetRunningAppProcessesなどは特に権限が入らなかったりしました。
getRunningTaskはGET_TASKSの権限が必要でした。
しかし、Android5.0からはgetRunningTasksとgetRecentTasksはDeprecatedになり、GET_TASKS権限はREAL_GET_TASKSに隠蔽されて通常のアプリでは使えなくなりました。
getRunningTasks,getRecentTasksの挙動
Deprecatedになりましたが、呼ぶことはできます。
Homeアプリと自アプリ以外のtaskは取得できなくなったようです。
getRunningAppProcessesの挙動
getRunningAppProcessesなどの多くのメソッドにも注記が追加されました。
Note: this method is only intended for debugging or building a user-facing process management UI.
// このメソッドはデバッグやユーザがプロセス管理を行うUIを作るためのものです。
意味がちょっとわからなかったのですが、getRunningAppProcessesでもLollipopのアップデートによって徐々に挙動が変化しました。
caller ***** does not hold REAL_GET_TASKS; limiting output エラー
Issue 2347: ActivityManager getRunningAppProcesses not woking
具体的には、今まではすべての動作プロセスの情報が取得できましたが、Lollipopの特定ビルド(Nexus5/6ではLMY48I)以降では、自分のアプリ(正確に自分と同一のユーザグループのアプリ)のプロセスの情報のみ取得できるようになりました。
つまり、getRunningServicesなどで自分のアプリのサービスが起動済みかどうかなど、確認する用途で使っている場合には影響はなさそうです。
getProcessMemoryInfo
未確認ですが、プロセスリストが取得できないのでpidがわからず、memoryの使用状況などわからなくなりそうな気がします。。