1717package io .appium .settings .recorder ;
1818
1919import android .Manifest ;
20+ import android .app .AppOpsManager ;
2021import android .content .Context ;
2122import android .content .Intent ;
23+ import android .content .pm .ApplicationInfo ;
2224import android .content .pm .PackageManager ;
2325import android .os .Build ;
2426import android .util .Log ;
2527import android .view .Display ;
2628import android .view .Surface ;
2729import android .view .WindowManager ;
2830
31+ import androidx .annotation .RequiresApi ;
2932import androidx .core .app .ActivityCompat ;
3033
3134import static android .content .Context .WINDOW_SERVICE ;
@@ -45,12 +48,33 @@ public static boolean isLowerThanQ() {
4548 return Build .VERSION .SDK_INT < Build .VERSION_CODES .Q ;
4649 }
4750
51+ @ RequiresApi (api = Build .VERSION_CODES .Q )
4852 public static boolean areRecordingPermissionsGranted (Context context ) {
4953 // Check if we have required permission
5054 int permissionAudio = ActivityCompat .checkSelfPermission (context ,
5155 Manifest .permission .RECORD_AUDIO );
5256
53- return permissionAudio == PackageManager .PERMISSION_GRANTED ;
57+ return permissionAudio == PackageManager .PERMISSION_GRANTED
58+ && isMediaProjectionPermissionGranted (context );
59+ }
60+
61+ @ RequiresApi (api = Build .VERSION_CODES .Q )
62+ public static boolean isMediaProjectionPermissionGranted (Context context ) {
63+ try {
64+ PackageManager packageManager = context .getPackageManager ();
65+ ApplicationInfo applicationInfo =
66+ packageManager .getApplicationInfo (context .getPackageName (), 0 );
67+ AppOpsManager appOpsManager =
68+ (AppOpsManager ) context .getSystemService (Context .APP_OPS_SERVICE );
69+ // AppOpsManager.OPSTR_PROJECT_MEDIA == "android:project_media" is a hidden field value,
70+ // so directly taken from https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/app/AppOpsManager.java#1532
71+ int mode = appOpsManager .unsafeCheckOpNoThrow ("android:project_media" ,
72+ applicationInfo .uid , applicationInfo .packageName );
73+ return (mode == AppOpsManager .MODE_ALLOWED );
74+ } catch (PackageManager .NameNotFoundException e ) {
75+ Log .e (TAG , "Exception while checking media projection permission" , e );
76+ return false ;
77+ }
5478 }
5579
5680 public static boolean isValidFileName (String filename ) {
0 commit comments