Notice
Recent Posts
Recent Comments
Link
투케이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///===========//: ================================================
반응형
'Android' 카테고리의 다른 글
Comments