Android settings

setting数据库主要使用 SettingsProvider+DatabaseHelper 实现,类似的实现还有 通讯录、通话记录

文件位于:

frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java

frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java

setting 数据库的名称为 settings.db ,里面包含三张表 分别为:system、secure、global

  1. Global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限;

  2. System:包含各种各样的用户偏好系统设置,第三方APP有读没有写的权限;

  3. Secure:安全性的用户偏好系统设置,第三方APP有读没有写的权限。

  4. 其中settings_global.xml 、settings_secure.xml 、settings_system.xml 对应/frameworks/base/core/java/android/provider/Settings.java中的三个内部类:Global、Secure、System。

  5. settings_global.xml 、settings_secure.xml 、settings_system.xml 位于 /data/system/users/0/ 下

    这里需要再关注一个文件 frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java

    在这个文件中:定义了各数据库对应的xml文件

    private static final String SETTINGS_FILE_GLOBAL = "settings_global.xml";
    private static final String SETTINGS_FILE_SYSTEM = "settings_system.xml";
    private static final String SETTINGS_FILE_SECURE = "settings_secure.xml";
    private static final String SETTINGS_FILE_SSAID = "settings_ssaid.xml";
    private static final String SETTINGS_FILE_CONFIG = "settings_config.xml";
    final File globalSettingsFile = mSettingsRegistry.getSettingsFile(
        makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM));
    final File systemSettingsFile = mSettingsRegistry.getSettingsFile(
        makeKey(SETTINGS_TYPE_SYSTEM, UserHandle.USER_SYSTEM));
    final File secureSettingsFile = mSettingsRegistry.getSettingsFile(
        makeKey(SETTINGS_TYPE_SECURE, UserHandle.USER_SYSTEM));
    final File ssaidSettingsFile = mSettingsRegistry.getSettingsFile(
        makeKey(SETTINGS_TYPE_SSAID, UserHandle.USER_SYSTEM));
    final File configSettingsFile = mSettingsRegistry.getSettingsFile(
        makeKey(SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM));

    并在getSettingsFile方法中 读取对应的xml文件

      private File getSettingsFile(int key) {
                if (isConfigSettingsKey(key)) {
                    final int userId = getUserIdFromKey(key);
                    return new File(Environment.getUserSystemDirectory(userId),
                            SETTINGS_FILE_CONFIG);
                } else if (isGlobalSettingsKey(key)) {
                    final int userId = getUserIdFromKey(key);
                    return new File(Environment.getUserSystemDirectory(userId),
                            SETTINGS_FILE_GLOBAL);
                } else if (isSystemSettingsKey(key)) {
                    final int userId = getUserIdFromKey(key);
                    return new File(Environment.getUserSystemDirectory(userId),
                            SETTINGS_FILE_SYSTEM);
                } else if (isSecureSettingsKey(key)) {
                    final int userId = getUserIdFromKey(key);
                    return new File(Environment.getUserSystemDirectory(userId),
                            SETTINGS_FILE_SECURE);
                } else if (isSsaidSettingsKey(key)) {
                    final int userId = getUserIdFromKey(key);
                    return new File(Environment.getUserSystemDirectory(userId),
                            SETTINGS_FILE_SSAID);
                } else {
                    throw new IllegalArgumentException("Invalid settings key:" + key);
                }
            }

  6. SettingsProvider和SystemProperties有以下不同点: 1、数据保存方式不同:SystemProperties的数据保存属性文件中(/system/build.prop等),开机后会被加载到system properties store;SettingsProvider的数据保存在文件/data/system/users/0/settings_***.xml和数据库settings.db中; 2、作用范围不同:SystemProperties可以实现跨进程、跨层次调用,即底层的c/c++可以调用,java层也可以调用;SettingProvider只能能在java层(APP)使用; 3、公开程度不同:SettingProvider有部分功能上层第三方APP可以使用(对于加了@hide标记的第三方APP仅可读,不可修改),SystemProperties上层第三方APP不可以使用。

secure表中存有:

Settings.Secure.ADB_ENABLED,
Settings.Secure.ANDROID_ID,
Settings.Secure.BLUETOOTH_ON,
Settings.Secure.DATA_ROAMING,数据漫游(手机里设置的)
Settings.Secure.DEVICE_PROVISIONED,
Settings.Secure.HTTP_PROXY,
Settings.Secure.INSTALL_NON_MARKET_APPS,
Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
Settings.Secure.LOGGING_ID,
Settings.Secure.NETWORK_PREFERENCE,
Settings.Secure.PARENTAL_CONTROL_ENABLED,
Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
Settings.Secure.SETTINGS_CLASSNAME,
Settings.Secure.USB_MASS_STORAGE_ENABLED,
Settings.Secure.USE_GOOGLE_MAIL,
Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT,
Settings.Secure.WIFI_ON,
Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE,
Settings.Secure.WIFI_WATCHDOG_AP_COUNT,
Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS,
Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED,
Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS,
Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT,
Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS,
Settings.Secure.WIFI_WATCHDOG_ON,
Settings.Secure.WIFI_WATCHDOG_PING_COUNT,
Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS,
Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS,
Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND 
Settings.Secure.MOUNT_UMS_AUTOSTART
Settings.Secure.MOUNT_UMS_PROMPT
Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED
Settings.Secure.LOCK_PATTERN_ENABLED,
Settings.Secure.LOCK_PATTERN_VISIBLE,
Settings.Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED
Settings.Secure.LONG_PRESS_TIMEOUT
Settings.Secure.TOUCH_EXPLORATION_ENABLED
Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD
Settings.Secure.ACCESSIBILITY_ENABLED
Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0)                 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "");
Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, "");
Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
Settings.Secure.SCREENSAVER_ENABLED,
Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
Settings.Secure.SCREENSAVER_COMPONENTS,
Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
Settings.Secure.ADB_ENABLED,
Settings.Secure.BLUETOOTH_ON,
Settings.Secure.DATA_ROAMING,
Settings.Secure.DEVICE_PROVISIONED,
Settings.Secure.INSTALL_NON_MARKET_APPS,
Settings.Secure.USB_MASS_STORAGE_ENABLED
Settings.Secure.USER_SETUP_COMPLETE,
Settings.Secure.USER_SETUP_COMPLETE,
Settings.Secure.INSTALL_NON_MARKET_APPS
Settings.Secure.INSTALL_NON_MARKET_APPS,
Settings.Secure.WAKE_GESTURE_ENABLED,
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, -1);
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, oldShow);
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS);
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
Settings.Secure.SLEEP_TIMEOUT,
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED
Settings.Secure.ALLOW_MOCK_LOCATION,
Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
Settings.Secure.MOUNT_UMS_AUTOSTART,
Settings.Secure.MOUNT_UMS_PROMPT,
Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
Settings.Secure.LONG_PRESS_TIMEOUT,
Settings.Secure.TOUCH_EXPLORATION_ENABLED,
Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
Settings.Secure.SCREENSAVER_ENABLED,
Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
Settings.Secure.SCREENSAVER_COMPONENTS,
Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
Settings.Secure.USER_SETUP_COMPLETE,
Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
Settings.Secure.INSTALL_NON_MARKET_APPS,
Settings.Secure.WAKE_GESTURE_ENABLED,
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
Settings.Secure.SLEEP_TIMEOUT,
Settings.Secure.BACKUP_ENABLED,
Settings.Secure.BACKUP_TRANSPORT,

global表

Settings.Global.ASSISTED_GPS_ENABLED
Settings.Global.SET_INSTALL_LOCATION,
Settings.Global.DEFAULT_INSTALL_LOCATION
Settings.Global.SET_INSTALL_LOCATION, 0);
Settings.Global.DEFAULT_INSTALL_LOCATION,
Settings.Global.PACKAGE_VERIFIER_TIMEOUT,
Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE
Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS
Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD,
Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
Settings.Global.SEND_ACTION_APP_ERROR,
Settings.Global.DROPBOX_AGE_SECONDS,
Settings.Global.DROPBOX_MAX_FILES,
Settings.Global.DROPBOX_QUOTA_KB,
Settings.Global.DROPBOX_QUOTA_PERCENT,
Settings.Global.DROPBOX_RESERVE_PERCENT,
Settings.Global.DROPBOX_TAG_PREFIX,
Settings.Global.ERROR_LOGCAT_PREFIX,
Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE,
Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES,
Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES,
Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
Settings.Global.CONNECTIVITY_CHANGE_DELAY,
Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED,
Settings.Global.CAPTIVE_PORTAL_SERVER,
Settings.Global.NSD_ON,
Settings.Global.SET_INSTALL_LOCATION,
Settings.Global.DEFAULT_INSTALL_LOCATION,
Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY,
Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY,
Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT,
Settings.Global.HTTP_PROXY,
Settings.Global.GLOBAL_HTTP_PROXY_HOST,
Settings.Global.GLOBAL_HTTP_PROXY_PORT,
Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
Settings.Global.SET_GLOBAL_HTTP_PROXY,
Settings.Global.DEFAULT_DNS_SERVER,
Settings.Global.BLUETOOTH_HEADSET_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX,
Settings.Global.WINDOW_ANIMATION_SCALE,
Settings.Global.TRANSITION_ANIMATION_SCALE,
Settings.Global.ANIMATOR_DURATION_SCALE,
Settings.Global.FANCY_IME_ANIMATIONS,
Settings.Global.COMPATIBILITY_MODE,
Settings.Global.EMERGENCY_TONE,
Settings.Global.CALL_AUTO_RETRY,
Settings.Global.DEBUG_APP,
Settings.Global.WAIT_FOR_DEBUGGER,
Settings.Global.ALWAYS_FINISH_ACTIVITIES,
Settings.Global.PREFERRED_NETWORK_MODE,
Settings.Global.CDMA_SUBSCRIPTION_MODE,
Settings.Global.MODE_RINGER
Settings.Global.DEVICE_PROVISIONED
Settings.Global.BUGREPORT_IN_POWER_MENU 
Settings.Global.LOW_BATTERY_SOUND_TIMEOUT,
Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
Settings.Global.DEVICE_NAME
Settings.Global.TRUSTED_SOUND,
Settings.Global.MODE_RINGER
Settings.Global.DEVICE_NAME
Settings.Global.THEATER_MODE_ON,
Settings.Global.AIRPLANE_MODE_ON,
Settings.Global.THEATER_MODE_ON,
Settings.Global.AIRPLANE_MODE_RADIOS,
Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
Settings.Global.ASSISTED_GPS_ENABLED,
Settings.Global.AUTO_TIME,
Settings.Global.AUTO_TIME_ZONE,
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
Settings.Global.WIFI_SLEEP_POLICY,
Settings.Global.MODE_RINGER,
Settings.Global.WIFI_ON,
Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
Settings.Global.BLUETOOTH_ON,
Settings.Global.CDMA_CELL_BROADCAST_SMS,
Settings.Global.DATA_ROAMING,
Settings.Global.DEVICE_PROVISIONED,
Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE,
Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE,
Settings.Global.MOBILE_DATA,
Settings.Global.NETSTATS_ENABLED,
Settings.Global.USB_MASS_STORAGE_ENABLED,
Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
Settings.Global.WIFI_DISPLAY_ON,
Settings.Global.LOCK_SOUND,
Settings.Global.UNLOCK_SOUND,
Settings.Global.TRUSTED_SOUND,
Settings.Global.POWER_SOUNDS_ENABLED,
Settings.Global.LOW_BATTERY_SOUND,
Settings.Global.DOCK_SOUNDS_ENABLED,
Settings.Global.DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY,
Settings.Global.DESK_DOCK_SOUND,
Settings.Global.DESK_UNDOCK_SOUND,
Settings.Global.CAR_DOCK_SOUND,
Settings.Global.CAR_UNDOCK_SOUND,
Settings.Global.DOCK_AUDIO_MEDIA_ENABLED,
Settings.Global.SET_INSTALL_LOCATION, 0);
Settings.Global.DEFAULT_INSTALL_LOCATION,
Settings.Global.EMERGENCY_TONE, 0);
Settings.Global.CALL_AUTO_RETRY, 0);
Settings.Global.PREFERRED_NETWORK_MODE, val.toString());
Settings.Global.CDMA_SUBSCRIPTION_MODE, type);
Settings.Global.LOW_BATTERY_SOUND_TIMEOUT,
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
Settings.Global.DEVICE_NAME, getDefaultDeviceName());
Settings.Global.LID_BEHAVIOR, defaultLidBehavior);

system表

Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
Settings.System.WINDOW_ANIMATION_SCALE + "'");
Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
Settings.System.WINDOW_ANIMATION_SCALE + "'");
Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Settings.System.HAPTIC_FEEDBACK_ENABLED + "'");
Settings.System.NOTIFICATION_LIGHT_PULSE,
Settings.System.VOLUME_BLUETOOTH_SCO,
Settings.System.VIBRATE_IN_SILENT,
Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
Settings.System.AUTO_TIME, 0);
Settings.System.AUTO_TIME_ZONE,
Settings.System.USER_ROTATION,
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
Settings.System.WINDOW_ANIMATION_SCALE + "'");
Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
Settings.System.NOTIFICATIONS_USE_RING_VOLUME + "'");
 Settings.System.AIRPLANE_MODE_RADIOS + "'");
Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
Settings.System.VIBRATE_IN_SILENT,
Settings.System.LOCKSCREEN_DISABLED,
Settings.System.VIBRATE_IN_SILENT + "'");
Settings.System.STAY_ON_WHILE_PLUGGED_IN };
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SIP_ADDRESS_ONLY);
Settings.System.SIP_CALL_OPTIONS);
Settings.System.SIP_ASK_ME_EACH_TIME);
Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 0);
Settings.System.SCREEN_OFF_TIMEOUT, "-1" },
Settings.System.SCREEN_OFF_TIMEOUT,
Settings.System.VIBRATE_ON, 0);
Settings.System.VIBRATE_ON, vibrateSetting);
Settings.System.SCREEN_OFF_TIMEOUT,
Settings.System.SCREEN_BRIGHTNESS_MODE + "','" + value + "');");
Settings.System.VOLUME_MUSIC,
Settings.System.VOLUME_RING,
Settings.System.VOLUME_SYSTEM,
Settings.System.VOLUME_VOICE,
Settings.System.VOLUME_ALARM,
Settings.System.VOLUME_NOTIFICATION,
Settings.System.VOLUME_BLUETOOTH_SCO,
Settings.System.MODE_RINGER_STREAMS_AFFECTED,
Settings.System.MUTE_STREAMS_AFFECTED,
Settings.System.VIBRATE_ON + "'");
Settings.System.VIBRATE_ON, vibrate);
Settings.System.DIM_SCREEN,
Settings.System.SCREEN_OFF_TIMEOUT,
Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
Settings.System.HEARING_AID, 0);
Settings.System.TTY_MODE, 0);
Settings.System.SCREEN_BRIGHTNESS_FOR_VR,
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.ACCELEROMETER_ROTATION,
Settings.System.NOTIFICATION_LIGHT_PULSE,
Settings.System.POINTER_SPEED,
Settings.System.DTMF_TONE_WHEN_DIALING,
Settings.System.SOUND_EFFECTS_ENABLED,
Settings.System.HAPTIC_FEEDBACK_ENABLED,
Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
Settings.System.WINDOW_ANIMATION_SCALE,
Settings.System.TRANSITION_ANIMATION_SCALE,
Settings.System.HAPTIC_FEEDBACK_ENABLED,
Settings.System.LOCKSCREEN_DISABLED
Settings.System.LOCKSCREEN_DISABLED,
            

默认值的加载 :

def_sleep_timeout 定义在 frameworks/base/packages/SettingsProvider/res/values/defaults.xml下

<integer name="def_sleep_timeout">-1</integer>

overlay文件位于device/google/atv/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<integer name="def_sleep_timeout">86400000</integer>
loadIntegerSetting(stmt, Settings.Secure.SLEEP_TIMEOUT,R.integer.def_sleep_timeout);
​
private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
    loadSetting(stmt, key,Integer.toString(mContext.getResources().getInteger(resid)));
}

设置命令 :setting get/put 表名 字段名 (值)

settings list secure |grep sleep_timeout    
settings get secure sleep_timeout    进入 待机
settings put secure sleep_timeout
​
settings get system screen_off_timeout  进入屏保
settings put system screen_off_timeout
​
settings list global/system/secure   查询某个表里的所有属性

代码里设置

Settings.Global.putString(mContext.getContentResolver(), "audio_test_result", value);//修改
Settings.Global.getString(mContext.getContentResolver(), "audio_test_result");//查询

Setting 增加新字段的方法

1.在 frameworks\base\core\java\android\provider\Settings.java 中定义新字段

public static final String DIGITAL_AUDIO_FORMAT = "digital_audio_format";

2.在 frameworks\base\packages\SettingsProvider\res\values\defaults.xml中定义默认值

<integer name="def_digital_audio_format">0</integer>

3.在 frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java

中加载默认值

loadIntegerSetting(stmt, Settings.Global.DIGITAL_AUDIO_FORMAT,
                    R.integer.def_digital_audio_format);

4.使用命令 make api-stubs-docs-update-current-api 更新frameworks/base/api/current.txt文档

5.使用make 命令再次编译镜像即可

三、Settings中值的监听

有时需要监听Settings下面的值,这个时候可以通过ContentObserver 来监听值的变化。

1.首先自定义一个类继承ContentObserver,在onChange()方法里处理相应逻辑

public class SettingListener extends ContentObserver {
    /**
     * Creates a content observer.
     *
     * @param handler The handler to run {@link #onChange} on, or null if none.
     */
    public SettingListener(Handler handler) {
        super(handler);
    }
​
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
    }
​
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        String string = Settings.Global.getString(HwContext.getContext().getContentResolver(),
                Settings.Global.ADB_ENABLED);
        //处理变化后的逻辑
    }
}

2.注册监听。

mHandler = new Handler(true /*async*/);
mSettingListener = new SettingListener(mHandler);
mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor(
    Settings.Global.AUDIO_TEST_RESULT), false, mSettingListener, UserHandle.USER_ALL);

3.结束时候取消监听。

getContentResolver().unregisterContentObserver(mSettingListener);
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
我可以看到这段代码是 Java 语言编写的 Android 应用程序的通知栏更新方法。根据您的要求,我将对其进行修改,但是需要您提供更多上下文和明确的需求。 以下是一种可能的修改方式,该方式将此方法作为类的一部分,并将方法参数更改为更清晰的名称: ```java public class AkiNotificationManager { private static final String TAG = "AkiNotificationManager"; private static final int NOTIFICATION_ID = 1; private NotificationManager mAkiNotificationManager; private Notification.Builder mAkiBuilder; private RemoteViews mAkiRemoteViews; private AkiModel mAkiModel; private String mAkiCurTitle; private String mAkiCurArtist; private String mAkiCurAlbumPath; public AkiNotificationManager(Context context, AkiModel akiModel) { mAkiModel = akiModel; mAkiNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); mAkiBuilder = new Notification.Builder(context); mAkiRemoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_layout); mAkiBuilder.setCustomContentView(mAkiRemoteViews); mAkiBuilder.setSmallIcon(R.drawable.ic_music_note); mAkiBuilder.setAutoCancel(false); } public void updateNotification(boolean isPlaying, boolean updateAlbum) { if (isPlaying) { mAkiRemoteViews.setImageViewBitmap(R.id.notification_iv_play, BitmapFactory.decodeResource(getResources(), R.drawable.iv_pause_grey)); } else { mAkiRemoteViews.setImageViewBitmap(R.id.notification_iv_play, BitmapFactory.decodeResource(getResources(), R.drawable.iv_play_grey)); } if (updateAlbum) { mAkiRemoteViews.setTextViewText(R.id.notification_top_song, mAkiCurTitle); mAkiRemoteViews.setTextViewText(R.id.notification_top_singer, mAkiCurArtist); mAkiModel.getAlbumBitmap(bitmapCallBack, mAkiCurAlbumPath); Log.d(TAG, "updateNotification: Updating Album Art: " + mAkiCurAlbumPath); } mAkiBuilder.setCustomContentView(mAkiRemoteViews); mAkiNotificationManager.notify(NOTIFICATION_ID, mAkiBuilder.build()); } private final BitmapCallBack bitmapCallBack = new BitmapCallBack() { @Override public void setBitmap(Bitmap bitmap) { mAkiRemoteViews.setImageViewBitmap(R.id.notification_iv_album, bitmap); mAkiBuilder.setCustomContentView(mAkiRemoteViews); mAkiNotificationManager.notify(NOTIFICATION_ID, mAkiBuilder.build()); } }; public void setCurSong(String title, String artist, String albumPath) { mAkiCurTitle = title; mAkiCurArtist = artist; mAkiCurAlbumPath = albumPath; } } ``` 以上代码包含了一个名为 `AkiNotificationManager` 的类,该类包含了一个在构造函数中初始化的 `NotificationManager`,并且该类包含了一个 `updateNotification` 方法,该方法接受两个参数:一个布尔值,用于指示当前是否正在播放,以及另一个布尔值,用于指示是否需要更新专辑封面。此外,该类还包含一个 `setCurSong` 方法,用于设置当前播放的歌曲信息。 请注意,此代码仅用于演示目的,并且可能需要进一步修改,以符合您的具体需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaowang_lj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值