투케이2K

233. (AndroidStudio/android/java) QUERY_ALL_PACKAGES 앱 쿼리 상호 작용 권한 부여 실시 본문

Android

233. (AndroidStudio/android/java) QUERY_ALL_PACKAGES 앱 쿼리 상호 작용 권한 부여 실시

투케이2K 2021. 12. 13. 13:47

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : java

 

[소스 코드]

    // [AndroidManifest.xml 파일]
    <!-- QUERY_ALL_PACKAGES : 런처, 접근성, 브라우저, 보안 앱 등에서 기기에 설치된 모든 앱을 쿼리하거나 상호작용 하기 위함 -->
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />









    // TODO [QueryAllPackagesPermission 앱 설정 창 이동]
    public static void checkQueryAllPackages(Context mContext){
        if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) && !isAccessGranted(mContext)){
            Log.i("---","---");
            Log.e("//===========//","================================================");
            Log.i("","\n"+"[C_Permission >> checkQueryAllPackages() :: 앱 쿼리 권한 상태 확인]");
            Log.i("","\n"+"[상태 :: "+"앱 쿼리 권한 부여되지 않은 상태 >> 앱 쿼리 권한 설정 창 이동 실시"+"]");
            Log.e("//===========//","================================================");
            Log.i("---","---");
            // [Android Q 이상 버전에서 원격 제어앱 탐지를 위해 사용자 정보 접근 권한 필요]
            Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            Uri uri =  Uri.fromParts("package", mContext.getPackageName(), null);
            intent.setData(uri);
            mContext.startActivity(intent);
        }
        else if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) && isAccessGranted(mContext)) {
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"[C_Permission >> checkQueryAllPackages() :: 앱 쿼리 권한 상태 확인]");
            Log.i("","\n"+"[상태 :: "+"앱 쿼리 권한 부여된 상태"+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");
        }
        else {
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"[C_Permission >> checkQueryAllPackages() :: 앱 쿼리 권한 상태 확인]");
            Log.i("","\n"+"[상태 :: "+"Android Q 버전 이하 단말기"+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
    }
    // [타겟 api 설정 실시]
    @TargetApi(Build.VERSION_CODES.Q)
    private 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;
    }
 

 

반응형
Comments