From ef531e04a20779d62d31fff56077aaf1bb5f50aa Mon Sep 17 00:00:00 2001 From: Zimuzo Date: Thu, 1 Nov 2018 16:04:08 +0000 Subject: [PATCH] Stop throwing exception when re-starting MediaProjection MediaProjectionManager#getMediaProjection eventually calls start on a MediaProjection. Attempting to start an already started MediaProjection throws an exception. This makes it tricky to call a 'getter' multiple times with the same intent. Clients can try to cache the already gotten MediaProjection object but that is difficult to implement correctly especially as an already gotten MediaProjection could be stopped without notice to the client. Bug: 111131054 Test: gmscore running on an Android Q device without the capture_video permissions is able to use the MediaProjection APIs successfully. Change-Id: I8b1a5bfb5644f47924a39993a87b0ded5d554001 --- .../android/media/projection/MediaProjectionManager.java | 2 ++ .../media/projection/MediaProjectionManagerService.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/media/java/android/media/projection/MediaProjectionManager.java b/media/java/android/media/projection/MediaProjectionManager.java index 900e3bb62fcf1..b5e221324c978 100644 --- a/media/java/android/media/projection/MediaProjectionManager.java +++ b/media/java/android/media/projection/MediaProjectionManager.java @@ -90,6 +90,8 @@ public final class MediaProjectionManager { * int, android.content.Intent)} * @param resultData The resulting data from {@link android.app.Activity#onActivityResult(int, * int, android.content.Intent)} + * @throws IllegalStateException on pre-Q devices if a previously gotten MediaProjection + * from the same {@code resultData} has not yet been stopped */ public MediaProjection getMediaProjection(int resultCode, @NonNull Intent resultData) { if (resultCode != Activity.RESULT_OK || resultData == null) { diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java index a6ea6b2e1aeb3..fccff57e32349 100644 --- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java +++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java @@ -396,8 +396,9 @@ public final class MediaProjectionManagerService extends SystemService } synchronized (mLock) { if (isValidMediaProjection(asBinder())) { - throw new IllegalStateException( - "Cannot start already started MediaProjection"); + Slog.w(TAG, "UID " + Binder.getCallingUid() + + " attempted to start already started MediaProjection"); + return; } mCallback = callback; registerCallback(mCallback);