Skip to content

Commit 203ef2d

Browse files
committed
io.appium.settings: recording: Add media projection permission check to solidify code
Signed-off-by: sirmordred <[email protected]>
1 parent f618ac9 commit 203ef2d

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

app/src/main/java/io/appium/settings/recorder/RecorderUtil.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717
package io.appium.settings.recorder;
1818

1919
import android.Manifest;
20+
import android.app.AppOpsManager;
2021
import android.content.Context;
2122
import android.content.Intent;
23+
import android.content.pm.ApplicationInfo;
2224
import android.content.pm.PackageManager;
2325
import android.os.Build;
2426
import android.util.Log;
2527
import android.view.Display;
2628
import android.view.Surface;
2729
import android.view.WindowManager;
2830

31+
import androidx.annotation.RequiresApi;
2932
import androidx.core.app.ActivityCompat;
3033

3134
import 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

Comments
 (0)