안드로이드 6.0 이상 UsageStatsManager를 이용해 Process list 받아오기


- androidmanifest.xml


1
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />

cs


일단 해당 기능을 사용하기 위한 permission이 필요하다. 시스템 관련 권한 이므로 일반적인 권한을 얻는 것과는 다른 방식을 사용한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        // GET_USAGE_STATS 권한 확인
        boolean granted = false;
        AppOpsManager appOps = (AppOpsManager) GlobalClass.getInstance().getSystemService(Context.APP_OPS_SERVICE);
        int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,android.os.Process.myUid(), GlobalClass.getInstance().getPackageName());
 
        if (mode == AppOpsManager.MODE_DEFAULT) {
            granted = (GlobalClass.getInstance().checkCallingOrSelfPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) == PackageManager.PERMISSION_GRANTED);
        } else {
            granted = (mode == AppOpsManager.MODE_ALLOWED);
        }
 
        L.e(TAG, "===== CheckPhoneState isRooting granted = " + granted);
 
        if (granted == false)
        {
            // 권한이 없을 경우 권한 요구 페이지 이동
            Intent intent = new Intent(android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS);
            GlobalClass.getInstance().startActivity(intent);
        }
 
        if (!isRooting)
        {
            // 기타 프로세스 목록 확인
            UsageStatsManager usage = (UsageStatsManager) GlobalClass.getInstance().getSystemService(Context.USAGE_STATS_SERVICE);
            long time = System.currentTimeMillis();
            List<UsageStats> stats = usage.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*1000, time);
            if (stats != null)
            {
                SortedMap<Long, UsageStats> runningTask = new TreeMap<Long,UsageStats>();
                for (UsageStats usageStats : stats) {
                    runningTask.put(usageStats.getLastTimeUsed(), usageStats);
 
                    L.e(TAG, "===== CheckPhoneState isRooting packageName = " + usageStats.getPackageName());
                }
            }
            else
            {
                L.e(TAG, "===== CheckPhoneState isRooting stats is NULL");
            }
        }
cs


AppOpsManager를 통해 해당 권한이 granted 되었는지 확인하고, denied일 경우 (기본값 denied)


해당 권한을 얻을 수 있는 페이지로 이동하도록 한다. (17~18라인)


권한이 granted 되었다면 uageStatsManager를 사용하여 프로세스 리스트를 얻는다.

이 글을 공유하기


댓글(0)

Designed by CMSFactory.NET