Get all Settings.System keys
Categories:
Unveiling Android's Hidden Configurations: How to Get All Settings.System Keys

Explore the various methods to programmatically access and list all available keys within Android's Settings.System
table, crucial for debugging, development, and understanding device configurations.
The Settings.System
table in Android stores a vast array of system-wide device settings, ranging from screen brightness to sound volumes and animation scales. While many of these settings are accessible through the standard Android Settings UI, programmatically retrieving a comprehensive list of all available keys can be invaluable for developers, testers, and power users. This article delves into different approaches to achieve this, highlighting their advantages and limitations.
Understanding Settings.System
The Settings.System
class provides a persistent store for system settings. These settings are global and affect all users on the device. Unlike Settings.Secure
or Settings.Global
, Settings.System
settings are generally considered 'public' and can often be modified by applications with appropriate permissions. However, directly querying all keys isn't straightforward through a single API call.
flowchart TD A[Start] A --> B{Need all Settings.System keys?} B -->|Yes| C[Method 1: Reflection] B -->|Yes| D[Method 2: ContentResolver Query] B -->|Yes| E[Method 3: ADB Shell] C --> F[Pros: Programmatic, In-app] C --> G[Cons: Incomplete, API-dependent] D --> H[Pros: Direct DB access, Comprehensive] D --> I[Cons: Requires READ_SETTINGS, Less common] E --> J[Pros: No code, Device-level] E --> K[Cons: Manual, Requires ADB setup] F & H & J --> L[Analyze Keys] G & I & K --> L L --> M[End]
Flowchart illustrating different approaches to retrieve Settings.System keys.
Method 1: Using Reflection (Programmatic, In-App)
One common approach to discover Settings.System
keys programmatically is through Java Reflection. The Settings.System
class contains numerous public static final String fields, each representing a specific setting key. By iterating over these fields, you can obtain a list of keys known at compile time for the Android SDK version you are targeting. This method is useful for in-app discovery but will not reveal keys added dynamically or those not exposed as public constants in the SDK.
import android.provider.Settings;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class SettingsKeyExtractor {
public static List<String> getAllSystemSettingKeys() {
List<String> keys = new ArrayList<>();
Field[] fields = Settings.System.class.getFields();
for (Field field : fields) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers()) &&
java.lang.reflect.Modifier.isFinal(field.getModifiers()) &&
field.getType() == String.class) {
try {
keys.add((String) field.get(null));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return keys;
}
public static void main(String[] args) {
List<String> systemKeys = getAllSystemSettingKeys();
for (String key : systemKeys) {
System.out.println(key);
}
}
}
Settings.System
class. It will not find keys that are dynamically added by manufacturers, carriers, or other apps, or those that are not exposed as constants in the Android SDK version being used.Method 2: Querying the ContentResolver (Comprehensive, Requires Permission)
For a more comprehensive list of all keys currently stored in the Settings.System
table on a device, you can directly query the underlying database via the ContentResolver
. This method requires the android.permission.READ_SETTINGS
permission, which is a system-level permission and typically granted only to system apps or apps signed with the platform key. However, if you have the necessary permissions (e.g., in a custom ROM or a privileged app), this is the most complete way to get all keys and their current values.
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.Settings;
import java.util.HashMap;
import java.util.Map;
public class SettingsDbQuery {
public static Map<String, String> getAllSystemSettings(ContentResolver contentResolver) {
Map<String, String> settingsMap = new HashMap<>();
Uri uri = Settings.System.CONTENT_URI;
Cursor cursor = null;
try {
cursor = contentResolver.query(
uri,
new String[]{Settings.System.NAME, Settings.System.VALUE},
null, null, null
);
if (cursor != null && cursor.moveToFirst()) {
int nameIndex = cursor.getColumnIndex(Settings.System.NAME);
int valueIndex = cursor.getColumnIndex(Settings.System.VALUE);
do {
String name = cursor.getString(nameIndex);
String value = cursor.getString(valueIndex);
settingsMap.put(name, value);
} while (cursor.moveToNext());
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return settingsMap;
}
// Example usage (requires a ContentResolver instance, e.g., from a Context)
// public void printAllSettings(Context context) {
// Map<String, String> allSettings = getAllSystemSettings(context.getContentResolver());
// for (Map.Entry<String, String> entry : allSettings.entrySet()) {
// System.out.println(entry.getKey() + " = " + entry.getValue());
// }
// }
}
ContentResolver
method, your app must have the READ_SETTINGS
permission declared in its AndroidManifest.xml
. For non-system apps, this permission is typically not granted, leading to a SecurityException
.Method 3: Using ADB Shell (External Tool)
For debugging and development purposes, the Android Debug Bridge (ADB) provides a powerful command-line interface to interact with a connected device. You can directly query the Settings.System
table using the settings
command. This method does not require any application code or special permissions on the device itself, only ADB access from your development machine.
adb shell settings list system
This command will output a list of all Settings.System
keys and their corresponding values, one per line. It's an excellent tool for quick inspection and verification without modifying your application code.
adb shell settings list system
command using grep
(on Linux/macOS) or findstr
(on Windows) to search for specific keys or patterns, e.g., adb shell settings list system | grep 'anim'
.