15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Android][Lollipop]UsageStatsManagerの権限状態の確認方法

Posted at

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のgetRunningTasksgetRecentTasksgetRunningAppProcessesで取得することができました。
しかも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の使用状況などわからなくなりそうな気がします。。

15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?