In android, how to change the settings of Daydream from code?
Categories:
Programmatically Controlling Android Daydream Settings

Learn how to interact with and modify Android Daydream (Screensaver) settings directly from your application code, focusing on Android 4.4 KitKat and later versions.
Android's Daydream feature, introduced in Android 4.2 (Jelly Bean) and prominently used in Android 4.4 (KitKat), allows devices to display interactive screensavers while docked or charging. While users can configure Daydream through system settings, developers might need to programmatically check its status or even influence its behavior within their applications. This article explores the APIs and considerations for interacting with Daydream settings from code.
Understanding Daydream and Its Settings
Daydream, also known as 'Screensaver' in newer Android versions, is a feature that activates when the device is idle, docked, or charging. It can display various content, such as photo albums, news feeds, or custom applications. The primary settings for Daydream include enabling/disabling it, selecting the active Daydream service, and configuring when it should activate (e.g., 'While docked', 'While charging', or 'Both'). These settings are typically managed through the system's 'Display' or 'Screensaver' settings menu.
flowchart TD A[User Action] --> B{Device Idle/Docked/Charging?} B -- Yes --> C{Daydream Enabled?} C -- Yes --> D[Select Daydream Service] D --> E[Daydream Activates] C -- No --> F[Screen Off/Lock Screen] B -- No --> F
Android Daydream Activation Flow
Accessing Daydream Settings Programmatically
Directly changing Daydream settings like enabling/disabling it or selecting a specific service from an application is generally restricted for security and user experience reasons. Android's design philosophy prioritizes user control over system-wide settings. However, you can read certain settings and potentially launch the system settings screen for the user to make changes. The relevant settings are stored in the Settings.Secure
and Settings.System
tables.
import android.content.ContentResolver;
import android.provider.Settings;
import android.util.Log;
public class DaydreamHelper {
private static final String TAG = "DaydreamHelper";
public static boolean isDaydreamEnabled(ContentResolver contentResolver) {
try {
// For Android 4.4 KitKat and earlier, use 'screensaver_enabled'
// For newer versions, 'screensaver_enabled' might still work or be deprecated.
// The exact key might vary slightly or be renamed to 'dream_enabled' or similar
// depending on the Android version and OEM customizations.
int enabled = Settings.Secure.getInt(contentResolver, "screensaver_enabled", 0);
return enabled == 1;
} catch (Settings.SettingNotFoundException e) {
Log.e(TAG, "Daydream setting not found: " + e.getMessage());
return false;
}
}
public static String getActiveDaydreamService(ContentResolver contentResolver) {
try {
// This retrieves the component name of the currently selected Daydream service.
// Example: "com.android.dreams.basic/com.android.dreams.basic.ColorsDream"
return Settings.Secure.getString(contentResolver, "screensaver_components");
} catch (Exception e) {
Log.e(TAG, "Error getting active Daydream service: " + e.getMessage());
return null;
}
}
public static int getDaydreamActivateConditions(ContentResolver contentResolver) {
try {
// This setting indicates when Daydream should activate.
// 0: Never
// 1: While docked
// 2: While charging
// 3: Both (docked or charging)
return Settings.Secure.getInt(contentResolver, "screensaver_activate_on_dock", 0) |
Settings.Secure.getInt(contentResolver, "screensaver_activate_on_charge", 0) << 1;
} catch (Settings.SettingNotFoundException e) {
Log.e(TAG, "Daydream activation condition setting not found: " + e.getMessage());
return 0;
}
}
}
Java code to read Daydream settings using Settings.Secure
.
Settings.Secure
or Settings.System
for Daydream settings without root access or system-level permissions is generally not possible for third-party apps. Attempting to do so will likely result in a SecurityException
or simply fail silently. These settings are protected.Launching Daydream Settings for User Interaction
The most user-friendly and permissible way for an application to influence Daydream settings is to direct the user to the relevant system settings screen. This allows the user to make informed decisions about their device's behavior. You can achieve this by launching an Intent
with the appropriate action.
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
public class DaydreamLauncher {
public static void launchDaydreamSettings(Context context) {
Intent intent = new Intent(Settings.ACTION_DREAM_SETTINGS);
// For older Android versions (e.g., KitKat), you might need a more generic display settings intent
// if ACTION_DREAM_SETTINGS is not available or doesn't lead to the correct screen.
// Intent intent = new Intent(Settings.ACTION_DISPLAY_SETTINGS);
if (intent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(intent);
} else {
// Fallback for devices where ACTION_DREAM_SETTINGS is not found
Intent fallbackIntent = new Intent(Settings.ACTION_DISPLAY_SETTINGS);
if (fallbackIntent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(fallbackIntent);
} else {
// Handle case where no relevant settings activity is found
// e.g., show a Toast message to the user
System.out.println("No Daydream or Display settings activity found.");
}
}
}
}
Java code to launch the Daydream settings screen.
Intent
can be resolved by an activity using intent.resolveActivity(getPackageManager()) != null
before calling startActivity()
. This prevents your app from crashing if the target activity doesn't exist on the user's device.Considerations for Android Versions and OEM Customizations
The Android ecosystem is diverse, and Daydream's implementation and available settings can vary significantly across different Android versions and device manufacturers (OEMs). While Settings.Secure.getInt("screensaver_enabled")
was common in KitKat, newer versions might use different keys or even deprecate direct access to these settings. Always test your code on various devices and Android versions to ensure compatibility. For critical functionality, guiding the user to the system settings remains the most robust approach.