From b54015504e6a5be98156a447bf73fc24c317bd52 Mon Sep 17 00:00:00 2001 From: TongTongStudio Date: Mon, 27 Jul 2026 02:22:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(settings):=20=E4=BC=98=E5=8C=96=E6=88=AA?= =?UTF-8?q?=E5=B1=8F=E6=96=B9=E6=A1=88=E5=B9=B6=E4=BC=98=E5=85=88=E4=BD=BF?= =?UTF-8?q?=E7=94=A8SurfaceControl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/utils/SettingsUtilsActivity.java | 9 +--- .../com/ttstd/dialer/utils/SystemUtils.java | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/ttstd/dialer/activity/settings/utils/SettingsUtilsActivity.java b/app/src/main/java/com/ttstd/dialer/activity/settings/utils/SettingsUtilsActivity.java index 5702298..3160a43 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/settings/utils/SettingsUtilsActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/settings/utils/SettingsUtilsActivity.java @@ -150,13 +150,8 @@ public class SettingsUtilsActivity extends BaseMvvmActivity() { + SystemUtils.screenshotSnap(SettingsUtilsActivity.this, filepath, new BlockingBaseObserver() { @Override public void onNext(@NonNull Integer integer) { if (integer == 0) { @@ -167,7 +162,7 @@ public class SettingsUtilsActivity extends BaseMvvmActivity observer) { + Observable.fromCallable(new Callable() { + @Override + public Integer call() throws Exception { + Bitmap bitmap = null; + // 1. 对于 Android 9.0 及以上,优先尝试反射 SurfaceControl + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + bitmap = takeScreenshotHighVersion(); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + bitmap = takeFullScreenshot(context); + } + + if (bitmap != null) { + try (FileOutputStream fos = new FileOutputStream(filepath)) { + boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); + if (success) { + Logger.i(TAG, "screenshotSnap: SurfaceControl 截屏成功"); + return 0; + } + } + } + } catch (Exception e) { + Logger.e(TAG, "SurfaceControl 截屏异常: " + e.getMessage()); + } + + // 2. Fallback: 使用命令行 (适用于旧版本或已 Root 设备) + Logger.w(TAG, "screenshotSnap: 尝试使用命令行回退"); + CmdUtil.Result result = CmdUtil.execute("screencap -p " + filepath); + if (result.code != 0) { + Logger.e(TAG, "screenshotSnap 命令行失败: " + result.error); + } + return result.code; + } + }).subscribe(observer); + } + public static void screenshotCmd(String filepath, Observer observer) { Observable.fromCallable(new Callable() { @Override