투케이2K

603. (Android/Java) usageStatsManager.queryEvents 사용해 특정 시간 동안 수행된 프로세스 정보 확인 - 앱 실행 스택 stack 정보 본문

Android

603. (Android/Java) usageStatsManager.queryEvents 사용해 특정 시간 동안 수행된 프로세스 정보 확인 - 앱 실행 스택 stack 정보

투케이2K 2023. 7. 17. 21:05

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[소스 코드]

    <!-- ============================================================= -->
    <!-- [Android Q 이상 : PACKAGE_USAGE_STATS 권한] -->
    <!-- ============================================================= -->
    <uses-permission xmlns:tools="http://schemas.android.com/tools"
        android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />








    // -----------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : [PACKAGE_USAGE_STATS 권한 부여 체크]
    // -----------------------------------------------------------------------------------------
    @TargetApi(Build.VERSION_CODES.Q)
    public static boolean isAccessGranted(Context mContext) {
        boolean granted = false; // 권한 부여 상태값 저장
        int mode = -1;
        PackageManager pm;
        ApplicationInfo app;
        AppOpsManager appOpsManager;
        try {
            // [AppOpsManager 서비스 객체 생성 실시]
            appOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);

            pm = mContext.getPackageManager();
            app = pm.getApplicationInfo(mContext.getPackageName(), 0);
            // [권한 부여 상태값 얻오온다]
            if (appOpsManager != null) {
                mode = appOpsManager.unsafeCheckOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, app.uid, app.packageName);
            }
            // [권한 부여가 된 경우]
            if (mode == AppOpsManager.MODE_ALLOWED) {
                granted = true;
            }
        }
        catch (Throwable why) {
            //why.printStackTrace();
        }
        // [결과 반환 실시]
        return granted;
    }







        // ---------------------------------------------------------------
        // [로직 처리 실시]
        // ---------------------------------------------------------------
        try {

            // [1]. AppOpsManager.OPSTR_GET_USAGE_STATS 권한 부여 상태 확인
            boolean grant = C_Permission.isAccessGranted(A_Intro.this);

            if (grant == true){ // [정상 권한 부여 됨]

                // [2]. 현재 활성화 되어 있는 프로세스 리스트 확인
                UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);


                // [3]. begin ~ end 범위 지정
                final long INTERVAL = 1000 * 60 * 5; // [5 분]
                final long end = System.currentTimeMillis(); // [현재 실행 시간]
                final long begin = end - INTERVAL; // [5 분전]


                // [4]. queryEvents 지정 (특정 시간 동안 수행된 프로세스 정보 확인)
                final UsageEvents usageEvents = usageStatsManager.queryEvents(begin, end);

                if (usageEvents != null){

                    while (usageEvents.hasNextEvent()) {

                        // [이벤트를 가져오기]
                        UsageEvents.Event event = new UsageEvents.Event();
                        usageEvents.getNextEvent(event);
                        
                        
                        // [이벤트가 포그라운드 상태 인 경우]
                        if (event != null){
                            S_Log._W_("이벤트 정보 확인", new String[]{
                                    "getPackageName :: " + String.valueOf(event.getPackageName()),
                                    "getTimeStamp :: " + String.valueOf(event.getTimeStamp()),
                                    "getEventType :: " + String.valueOf(event.getEventType()),
                            });
                        }

                    }

                }

            }
            else { // [권한 부여 안됨]
                
                // [권한 부여 설정 창 이동]
                Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                Uri uri =  Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }

        }
        catch (Exception e) {
            S_Log._printStackTrace_(A_Intro.this, "로직 처리 수행 에러", null, e);
        }
 

[결과 출력]

 

W///===========//: ================================================
I/: [LOG :: CLASS PLACE :: com.example.javaproject.A_Intro.onCreate(A_Intro.java:269)]
I/: ----------------------------------------------------
I/: [LOG :: DESCRIPTION :: 이벤트 정보 확인]
I/: ----------------------------------------------------
I/: [LOG :: getPackageName :: com.android.settings]
I/: ----------------------------------------------------
I/: [LOG :: getTimeStamp :: 1689551560652]
I/: ----------------------------------------------------
I/: [LOG :: getEventType :: 23]
W///===========//: ================================================




W///===========//: ================================================
I/: [LOG :: CLASS PLACE :: com.example.javaproject.A_Intro.onCreate(A_Intro.java:269)]
I/: ----------------------------------------------------
I/: [LOG :: DESCRIPTION :: 이벤트 정보 확인]
I/: ----------------------------------------------------
I/: [LOG :: getPackageName :: com.example.javaproject]
I/: ----------------------------------------------------
I/: [LOG :: getTimeStamp :: 1689551562244]
I/: ----------------------------------------------------
I/: [LOG :: getEventType :: 23]
W///===========//: ================================================

 

반응형
Comments