From 939c8e7f68583f444bd3f2dd4aa8b02f0ca11ddc Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Thu, 17 Jul 2025 18:26:44 +0200 Subject: [PATCH] Simplify settings access For Android >= 12, scrcpy executed "settings" commands (in a new process) rather than using the ContentProvider directly, due to permission issues [1]. However, these permission issues were resolved by introducing FakeContext.getContentResolver() [2]. Therefore, remove the use of "settings" commands and use the ContentProvider directly in all cases. Refs [1] cc0902b13c87fc98b1ed90b0700cc53ac4d7ee3c Refs [2] 91373d906b100349de959f49172d4605f66f64b2 Refs #6224 comment --- .../com/genymobile/scrcpy/util/Settings.java | 63 +++---------------- 1 file changed, 9 insertions(+), 54 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/util/Settings.java b/server/src/main/java/com/genymobile/scrcpy/util/Settings.java index e6465525..4eb67d18 100644 --- a/server/src/main/java/com/genymobile/scrcpy/util/Settings.java +++ b/server/src/main/java/com/genymobile/scrcpy/util/Settings.java @@ -1,13 +1,8 @@ package com.genymobile.scrcpy.util; -import com.genymobile.scrcpy.AndroidVersions; import com.genymobile.scrcpy.wrappers.ContentProvider; import com.genymobile.scrcpy.wrappers.ServiceManager; -import android.os.Build; - -import java.io.IOException; - public final class Settings { public static final String TABLE_SYSTEM = ContentProvider.TABLE_SYSTEM; @@ -18,66 +13,26 @@ public final class Settings { /* not instantiable */ } - private static void execSettingsPut(String table, String key, String value) throws SettingsException { - try { - Command.exec("settings", "put", table, key, value); - } catch (IOException | InterruptedException e) { - throw new SettingsException("put", table, key, value, e); - } - } - - private static String execSettingsGet(String table, String key) throws SettingsException { - try { - return Command.execReadLine("settings", "get", table, key); - } catch (IOException | InterruptedException e) { - throw new SettingsException("get", table, key, null, e); - } - } - public static String getValue(String table, String key) throws SettingsException { - if (Build.VERSION.SDK_INT <= AndroidVersions.API_30_ANDROID_11) { - // on Android >= 12, it always fails: - try (ContentProvider provider = ServiceManager.getActivityManager().createSettingsProvider()) { - return provider.getValue(table, key); - } catch (SettingsException e) { - Ln.w("Could not get settings value via ContentProvider, fallback to settings process", e); - } + try (ContentProvider provider = ServiceManager.getActivityManager().createSettingsProvider()) { + return provider.getValue(table, key); } - - return execSettingsGet(table, key); } public static void putValue(String table, String key, String value) throws SettingsException { - if (Build.VERSION.SDK_INT <= AndroidVersions.API_30_ANDROID_11) { - // on Android >= 12, it always fails: - try (ContentProvider provider = ServiceManager.getActivityManager().createSettingsProvider()) { - provider.putValue(table, key, value); - } catch (SettingsException e) { - Ln.w("Could not put settings value via ContentProvider, fallback to settings process", e); - } + try (ContentProvider provider = ServiceManager.getActivityManager().createSettingsProvider()) { + provider.putValue(table, key, value); } - execSettingsPut(table, key, value); } public static String getAndPutValue(String table, String key, String value) throws SettingsException { - if (Build.VERSION.SDK_INT <= AndroidVersions.API_30_ANDROID_11) { - // on Android >= 12, it always fails: - try (ContentProvider provider = ServiceManager.getActivityManager().createSettingsProvider()) { - String oldValue = provider.getValue(table, key); - if (!value.equals(oldValue)) { - provider.putValue(table, key, value); - } - return oldValue; - } catch (SettingsException e) { - Ln.w("Could not get and put settings value via ContentProvider, fallback to settings process", e); + try (ContentProvider provider = ServiceManager.getActivityManager().createSettingsProvider()) { + String oldValue = provider.getValue(table, key); + if (!value.equals(oldValue)) { + provider.putValue(table, key, value); } + return oldValue; } - - String oldValue = getValue(table, key); - if (!value.equals(oldValue)) { - putValue(table, key, value); - } - return oldValue; } }