From 50f121e8ec1ac3bfc41c24a5e670dc8d6e20c2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E5=88=BA=E8=9E=88?= Date: Thu, 4 Jun 2026 17:59:16 +0800 Subject: [PATCH] fix: compat takeScreenshot for android-16.0.0_r4 --- .../shizuku/ProxyUiAutomationConnection.kt | 26 +++++++++++++++++ .../android/app/IUiAutomationConnection.java | 5 ++++ .../java/android/view/IWindowManager.java | 4 +++ .../android/window/ScreenCaptureInternal.java | 28 +++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 hidden_api/src/main/java/android/window/ScreenCaptureInternal.java diff --git a/app/src/main/kotlin/li/songe/gkd/shizuku/ProxyUiAutomationConnection.kt b/app/src/main/kotlin/li/songe/gkd/shizuku/ProxyUiAutomationConnection.kt index fcea5766..e44224ee 100644 --- a/app/src/main/kotlin/li/songe/gkd/shizuku/ProxyUiAutomationConnection.kt +++ b/app/src/main/kotlin/li/songe/gkd/shizuku/ProxyUiAutomationConnection.kt @@ -12,6 +12,7 @@ import android.os.RemoteException import android.view.Display.DEFAULT_DISPLAY import android.view.accessibility.AccessibilityEvent import android.window.ScreenCapture +import android.window.ScreenCaptureInternal import androidx.annotation.RequiresApi import li.songe.gkd.util.AndroidTarget import rikka.shizuku.Shizuku @@ -192,6 +193,31 @@ class ProxyUiAutomationConnection : IUiAutomationConnection.Stub() { return true } + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + override fun takeScreenshot( + crop: Rect, + listener: ScreenCaptureInternal.ScreenCaptureListener, + displayId: Int, + ): Boolean { + synchronized(mLock) { + throwIfCalledByNotTrustedUidLocked() + throwIfShutdownLocked() + throwIfNotConnectedLocked() + } + val identity = clearCallingIdentity() + try { + val captureArgs = ScreenCaptureInternal.CaptureArgs.Builder() + .setSourceCrop(crop) + .build() + mWindowManager.captureDisplay(displayId, captureArgs, listener) + } catch (re: RemoteException) { + throw re.rethrowAsRuntimeException() + } finally { + restoreCallingIdentity(identity) + } + return true + } + private fun registerUiTestAutomationServiceLocked( client: IAccessibilityServiceClient, userId: Int, diff --git a/hidden_api/src/main/java/android/app/IUiAutomationConnection.java b/hidden_api/src/main/java/android/app/IUiAutomationConnection.java index 4d50af28..bfe250a5 100644 --- a/hidden_api/src/main/java/android/app/IUiAutomationConnection.java +++ b/hidden_api/src/main/java/android/app/IUiAutomationConnection.java @@ -7,6 +7,7 @@ import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.window.ScreenCapture; +import android.window.ScreenCaptureInternal; import androidx.annotation.DeprecatedSinceApi; import androidx.annotation.RequiresApi; @@ -45,4 +46,8 @@ public interface IUiAutomationConnection { @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) boolean takeScreenshot(Rect crop, ScreenCapture.ScreenCaptureListener listener, int displayId); + + // android-16.0.0_r4 + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) + boolean takeScreenshot(Rect crop, ScreenCaptureInternal.ScreenCaptureListener listener, int displayId); } diff --git a/hidden_api/src/main/java/android/view/IWindowManager.java b/hidden_api/src/main/java/android/view/IWindowManager.java index aac5392c..b0453296 100644 --- a/hidden_api/src/main/java/android/view/IWindowManager.java +++ b/hidden_api/src/main/java/android/view/IWindowManager.java @@ -5,6 +5,7 @@ import android.os.Build; import android.os.IBinder; import android.os.IInterface; import android.window.ScreenCapture; +import android.window.ScreenCaptureInternal; import androidx.annotation.DeprecatedSinceApi; import androidx.annotation.RequiresApi; @@ -41,4 +42,7 @@ public interface IWindowManager extends IInterface { @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) void captureDisplay(int displayId, ScreenCapture.CaptureArgs captureArgs, ScreenCapture.ScreenCaptureListener listener); + // android-16.0.0_r4 + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + void captureDisplay(int displayId, ScreenCaptureInternal.CaptureArgs captureArgs, ScreenCaptureInternal.ScreenCaptureListener listener); } diff --git a/hidden_api/src/main/java/android/window/ScreenCaptureInternal.java b/hidden_api/src/main/java/android/window/ScreenCaptureInternal.java new file mode 100644 index 00000000..93e9c047 --- /dev/null +++ b/hidden_api/src/main/java/android/window/ScreenCaptureInternal.java @@ -0,0 +1,28 @@ +package android.window; + +import android.graphics.Rect; +import android.os.Build; + +import androidx.annotation.RequiresApi; + +/** + * @version android-16.0.0_r4 + * @noinspection unused + */ +@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) +public class ScreenCaptureInternal { + public static class ScreenCaptureListener { + } + + public static class CaptureArgs { + public static class Builder> { + public ScreenCaptureInternal.CaptureArgs build() { + throw new RuntimeException(); + } + + public T setSourceCrop(Rect sourceCrop) { + throw new RuntimeException(); + } + } + } +}