Android 11 以上 SettingsProvider DatabaseHelper 解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: Android 11 以上 SettingsProvider DatabaseHelper 解析

Android 操作系统中,SettingsProvider 是一个非常关键的组件,它负责存储和管理系统和应用的设置。在这篇文章中,我将深入探讨 DatabaseHelper 类,这是 SettingsProvider 的核心部分。

1. DatabaseHelper 是什么?

DatabaseHelper 是一个继承自 SQLiteOpenHelper 的类,它负责创建、更新和管理系统设置数据库。系统设置数据库是一个 SQLite 数据库文件,它存储在 /data/system/users/0/settings_system.xml , /data/system/users/0/settings_secure.xml , /data/system/users/0/settings_global.xml 路径下,其中 user_id 是当前用户的 ID。系统设置数据库包含了多个表,每个表对应一种类型的设置,例如 system, secure, global 等。

2. 主要方法

2.1 onCreate(SQLiteDatabase db)

当数据库第一次创建时,这个方法会被调用。它负责初始化数据库表和默认的系统设置。

@Override
public void onCreate(SQLiteDatabase db) {
    // 创建系统设置表
    db.execSQL("CREATE TABLE system (" +
            "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
            "name TEXT UNIQUE ON CONFLICT REPLACE," +
            "value TEXT" +
            ");");
    // ... 其他表的创建代码 ...
    // 初始化默认设置
    loadDefaultSystemSettings(db);
}

2.2 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库版本升级时,这个方法会被调用。它负责更新数据库表结构和数据。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // 根据版本号进行相应的数据库升级操作
    if (oldVersion < 2) {
        // ... 升级到版本2的代码 ...
    }
    if (oldVersion < 3) {
        // ... 升级到版本3的代码 ...
    }
    // ... 其他版本的升级代码 ...
}

3. 数据表结构

为了更好地理解 DatabaseHelper,需要了解它所管理的数据表结构。以下是一些主要的表:

表名 描述 主要字段
system 存储系统级别的设置 _id, name, value
secure 存储安全相关的设置 _id, name, value
global 存储全局设置,对所有用户都有效 _id, name, value

4. 初始化默认设置

DatabaseHelper 还负责加载默认的系统设置。这些设置通常定义在 XML 资源文件中,并在数据库创建时加载。

private void loadDefaultSystemSettings(SQLiteDatabase db) {
    // 从资源文件中加载默认设置
    ContentValues values = new ContentValues();
    values.put("name", "example_setting_name");
    values.put("value", "example_setting_value");
    db.insert("system", null, values);
    // ... 加载其他默认设置 ...
}

5. 不同 Android 系统版本 settings 存储的系统位置,区别

Android 系统的 settings 是以 SQLite 数据库的形式存储在系统分区中的。不同的 Android 系统版本,settings 数据库的位置和结构可能会有所不同。以下是一些常见的 Android 系统版本和它们的 settings 数据库位置:

Android 版本 settings 数据库位置
Android 4.4 /data/data/com.android.providers.settings/databases/settings.db
Android 5.0 /data/system/users/0/settings.db
Android 6.0 /data/system/users/0/settings_system.db, /data/system/users/0/settings_secure.db, /data/system/users/0/settings_global.db
Android 7.0 ~ /data/system/users/0/settings_system.xml, /data/system/users/0/settings_secure.xml, /data/system/users/0/settings_global.xml
Android 11.0 /data/system/users/0/settings_system.xml ,/data/system/users/0/settings_secure.xml /data/system/users/0/settings_global.xml

从上表可以看出,Android 系统从 4.4 到 6.0 版本都是使用 SQLite 数据库来存储 settings 的,但是从不同的目录中读取。从 7.0 版本开始,Android 系统改用 XML 文件来存储 settings,并且将系统级别、安全级别和全局级别的 settings 分开存储在不同的目录中。

6. adb settings 命令的详细使用方法

adb 是 Android Debug Bridge 的缩写,它是一个用于连接和控制 Android 设备的工具。adb 提供了一个名为 settings 的子命令,可以用来查询和修改系统和应用的设置。

adb settings 命令的基本语法如下:

adb shell settings [namespace] [name] [value]

其中:

  • namespace 是指要操作的设置所属的命名空间,可以是 system, secure, global 或者其他应用定义的命名空间。
  • name 是指要操作的设置的名称。
  • value 是指要设置或者查询的值。

例如:

  • 查询系统设置中的屏幕亮度:
adb shell settings get system screen_brightness
  • 查询全局设置中的飞行模式状态:
adb shell settings get global airplane_mode_on

7. Android 系统如何新建 settings 变量 如何初始化

如果想要在 Android 系统中新建一个自定义的 settings 变量,需要做以下几个步骤:

  • SettingsContract 类中定义一个常量,作为自定义变量的名称。例如:
public static final String MY_SETTING = "my_setting";
  • DatabaseHelper 类中,在相应的数据表中添加一列,作为自定义变量的存储字段。例如:
db.execSQL("ALTER TABLE system ADD COLUMN my_setting TEXT;");
  • DatabaseHelper 类中,在 onCreate 方法中,为自定义变量设置一个默认值。例如:
values.put("name", "my_setting");
values.put("value", "default_value");
db.insert("system", null, values);
  • SettingsProvider 类中,在 call 方法中,为自定义变量添加一个读写的接口。例如:
case MY_SETTING:
    return getOrPutSetting(uri, db, "system", "my_setting", value);
  • Settings 类中,为自定义变量添加一个获取和设置的方法。例如:
public static String getMySetting(ContentResolver cr) {
    return Settings.System.getString(cr, MY_SETTING);
}
public static boolean putMySetting(ContentResolver cr, String value) {
    return Settings.System.putString(cr, MY_SETTING, value);
}

就可以在 Android 系统中使用自定义的 settings 变量了

以下是根据提供的 defaults.xml 文件内容制作的表格:

字段名称 值范围 字段意义
def_dim_screen true, false 是否降低屏幕亮度
def_screen_off_timeout 整数 (如: 60000) 屏幕关闭超时时间(毫秒)
def_sleep_timeout 整数 (如: -1) 睡眠超时时间
def_airplane_mode_on true, false 是否开启飞行模式
def_theater_mode_on true, false 是否开启剧院模式
def_airplane_mode_radios 字符串 (如: cell,bluetooth,wifi,nfc,wimax) 飞行模式下关闭的无线通信方式
airplane_mode_toggleable_radios 字符串 (如: bluetooth,wifi,nfc) 可在飞行模式下切换的无线通信方式
def_bluetooth_disabled_profiles 字符串 (如: 0) 默认禁用的蓝牙配置
def_auto_time true, false 是否自动设置时间
def_auto_time_zone true, false 是否自动设置时区
def_accelerometer_rotation true, false 是否允许加速度计旋转屏幕
def_screen_brightness 整数 (如: 102) 默认屏幕亮度 (0-255)
def_screen_brightness_automatic_mode true, false 是否自动调整屏幕亮度
def_window_animation_scale 分数 (如: 100%) 窗口动画缩放比例
def_window_transition_scale 分数 (如: 100%) 窗口过渡缩放比例
def_haptic_feedback true, false 是否开启触觉反馈
def_dock_sounds_enabled_when_accessibility 整数 (如: 0) 当辅助功能启用时,停靠声音是否启用
def_desk_dock_sound 字符串 (如: /product/media/audio/ui/Dock.ogg) 桌面停靠声音文件路径
def_desk_undock_sound 字符串 (如: /product/media/audio/ui/Undock.ogg) 桌面取消停靠声音文件路径
def_car_dock_sound 字符串 (如: /product/media/audio/ui/Dock.ogg) 汽车停靠声音文件路径
def_car_undock_sound 字符串 (如: /product/media/audio/ui/Undock.ogg) 汽车取消停靠声音文件路径
def_lockscreen_sounds_enabled 整数 (如: 1) 锁屏声音是否启用
def_lock_sound 字符串 (如: /product/media/audio/ui/Lock.ogg) 锁屏声音文件路径
def_unlock_sound 字符串 (如: /product/media/audio/ui/Unlock.ogg) 解锁声音文件路径
def_trusted_sound 字符串 (如: /product/media/audio/ui/Trusted.ogg) 受信任的声音文件路径
def_wireless_charging_started_sound 字符串 (如: /product/media/audio/ui/WirelessChargingStarted.ogg) 无线充电开始声音文件路径
def_charging_started_sound 字符串 (如: /product/media/audio/ui/ChargingStarted.ogg) 充电开始声音文件路径
def_max_sound_trigger_detection_service_ops_per_day 整数 (如: 1000) 声音触发检测服务每天的最大操作次数
def_sound_trigger_detection_service_op_timeout 整数 (如: 15000) 声音触发检测服务的操作超时时间
def_lockscreen_disabled true, false 是否禁用锁屏
def_device_provisioned true, false 设备是否已配置
def_dock_audio_media_enabled 整数 (如: 1) 停靠时是否启用音频媒体
def_notifications_use_ring_volume true, false 通知是否使用铃声音量
def_vibrate_in_silent true, false 静音模式下是否震动
def_sync_parent_sounds true, false 是否同步父音效
def_accessibility_speak_password true, false 辅助功能是否读出密码
def_touch_exploration_enabled true, false 是否启用触摸探索功能
def_accessibility_display_magnification_scale 分数 (如: 200%) 辅助功能显示放大比例
def_accessibility_display_magnification_enabled true, false 是否启用辅助功能显示放大
def_accessibility_display_magnification_auto_update true, false 辅助功能显示放大是否自动更新
def_user_rotation 整数 (如: 0) 用户旋转的默认设置
def_download_manager_max_bytes_over_mobile 整数 (如: -1) 通过移动数据下载的最大字节数
def_download_manager_recommended_max_bytes_over_mobile 整数 (如: -1) 通过移动数据下载的推荐最大字节数
def_long_press_timeout_millis 整数 (如: 400) 长按超时时间(毫秒)
def_multi_press_timeout_millis 整数 (如: 300) 多次按压超时时间(毫秒)
def_show_ime_with_hard_keyboard true, false 是否在硬键盘上显示输入法
def_pointer_speed 整数 (如: 0) 指针速度的默认设置
def_dtmf_tones_enabled true, false 是否启用DTMF音调
def_sound_effects_enabled true, false 是否启用UI触摸声音
def_stay_on_while_plugged_in true, false 插入时是否保持开机
def_max_dhcp_retries 整数 (如: 9) 连接到DHCP的最大重试次数
def_user_setup_complete true, false 用户设置是否完成
def_tv_user_setup_complete true, false TV用户设置是否完成
def_low_battery_sound_timeout 整数 (如: 0) 低电量声音超时时间
def_immersive_mode_confirmations 字符串 不再需要沉浸模式确认的包列表
def_wifi_scan_always_available 整数 (如: 0) Wi-Fi扫描是否始终可用
def_lock_screen_show_notifications 整数 (如: 1) 锁屏上是否显示通知
def_lock_screen_allow_private_notifications true, false 锁屏上是否允许私有通知
def_heads_up_enabled 整数 (如: 1) 是否启用Heads Up通知
def_device_name 字符串 (如: %1s s %2ss) 默认设备名称格式
def_device_name_simple 字符串 (如: %1$s) 简单的默认设备名称格式
def_wake_gesture_enabled true, false 是否启用唤醒手势
def_double_tap_to_wake true, false 是否启用双击唤醒
def_nfc_payment_component 字符串 NFC支付组件的默认设置
def_add_users_from_lockscreen true, false 是否允许从锁屏添加用户
def_end_button_behavior 整数 (如: 0x2) 结束按钮的行为
def_restrict_background_data true, false 是否限制后台数据
def_backup_manager_constants 字符串 备份管理器常量的默认设置
def_mobile_data_always_on true, false 移动数据是否始终开启
def_backup_local_transport_parameters 字符串 本地传输参数的备份默认设置
def_zen_duration 整数 (如: 0) Zen模式的默认持续时间
def_backup_agent_timeout_parameters 字符串 备份代理超时参数的默认设置
def_vibrate_when_ringing true, false 来电时是否震动
def_apply_ramping_ringer true, false 是否应用逐渐增强的铃声
def_charging_vibration_enabled true, false 充电时是否震动
def_charging_sounds_enabled true, false 充电时是否播放声音
def_notification_bubbles true, false 是否启用通知气泡
def_aware_enabled true, false Aware功能是否启用
def_skip_gesture true, false 是否启用跳过手势
def_silence_gesture true, false 是否启用静音手势
def_aware_lock_enabled true, false Aware锁定功能是否启用
def_hdmiControlAutoDeviceOff true, false HDMI控制自动设备关闭功能是否启用
def_screenshot_button_show 整数 (如: 0) 是否显示截图按钮的默认设置
def_dock_sounds_enabled_when_accessibility 整数 (如: 0) 当辅助功能启用时,停靠声音是否启用
def_desk_dock_sound 字符串 (如: /product/media/audio/ui/Dock.ogg) 桌面停靠声音文件路径
def_desk_undock_sound 字符串 (如: /product/media/audio/ui/Undock.ogg) 桌面取消停靠声音文件路径
def_car_dock_sound 字符串 (如: /product/media/audio/ui/Dock.ogg) 汽车停靠声音文件路径
def_car_undock_sound 字符串 (如: /product/media/audio/ui/Undock.ogg) 汽车取消停靠声音文件路径
def_lockscreen_sounds_enabled 整数 (如: 1) 锁屏声音是否启用
def_lock_sound 字符串 (如: /product/media/audio/ui/Lock.ogg) 锁屏声音文件路径
def_unlock_sound 字符串 (如: /product/media/audio/ui/Unlock.ogg) 解锁声音文件路径
def_trusted_sound 字符串 (如: /product/media/audio/ui/Trusted.ogg) 受信任的声音文件路径
def_wireless_charging_started_sound 字符串 (如: /product/media/audio/ui/WirelessChargingStarted.ogg) 无线充电开始声音文件路径
def_charging_started_sound 字符串 (如: /product/media/audio/ui/ChargingStarted.ogg) 充电开始声音文件路径
def_max_sound_trigger_detection_service_ops_per_day 整数 (如: 1000) 声音触发检测服务每天的最大操作次数
def_sound_trigger_detection_service_op_timeout 整数 (如: 15000) 声音触发检测服务的操作超时时间
def_lockscreen_disabled true, false 是否禁用锁屏
def_device_provisioned true, false 设备是否已配置
def_dock_audio_media_enabled 整数 (如: 1) 停靠时是否启用音频媒体
def_notifications_use_ring_volume true, false 通知是否使用铃声音量
def_vibrate_in_silent true, false 静音模式下是否震动
def_sync_parent_sounds true, false 是否同步父音效
def_accessibility_speak_password true, false 辅助功能是否读出密码
def_touch_exploration_enabled true, false 是否启用触摸探索功能
def_accessibility_display_magnification_scale 分数 (如: 200%) 辅助功能显示放大比例
def_accessibility_display_magnification_enabled true, false 是否启用辅助功能显示放大
def_accessibility_display_magnification_auto_update true, false 辅助功能显示放大是否自动更新
def_user_rotation 整数 (如: 0) 用户旋转的默认设置
def_download_manager_max_bytes_over_mobile 整数 (如: -1) 通过移动数据下载的最大字节数
def_download_manager_recommended_max_bytes_over_mobile 整数 (如: -1) 通过移动数据下载的推荐最大字节数
def_long_press_timeout_millis 整数 (如: 400) 长按超时时间(毫秒)
def_multi_press_timeout_millis 整数 (如: 300) 多次按压超时时间(毫秒)
def_show_ime_with_hard_keyboard true, false 是否在硬键盘上显示输入法
def_pointer_speed 整数 (如: 0) 指针速度的默认设置
def_dtmf_tones_enabled true, false 是否启用DTMF音调
def_sound_effects_enabled true, false 是否启用UI触摸声音
def_stay_on_while_plugged_in true, false 插入时是否保持开机
def_max_dhcp_retries 整数 (如: 9) 连接到DHCP的最大重试次数
def_user_setup_complete true, false 用户设置是否完成
def_tv_user_setup_complete true, false TV用户设置是否完成
def_low_battery_sound_timeout 整数 (如: 0) 低电量声音超时时间
def_immersive_mode_confirmations 字符串 不再需要沉浸模式确认的包列表
def_wifi_scan_always_available 整数 (如: 0) Wi-Fi扫描是否始终可用
def_lock_screen_show_notifications 整数 (如: 1) 锁屏上是否显示通知
def_lock_screen_allow_private_notifications true, false 锁屏上是否允许私有通知
def_heads_up_enabled 整数 (如: 1) 是否启用Heads Up通知
def_device_name 字符串 (如: %1s s %2ss) 默认设备名称格式
def_device_name_simple 字符串 (如: %1$s) 简单的默认设备名称格式
def_wake_gesture_enabled true, false 是否启用唤醒手势
def_double_tap_to_wake true, false 是否启用双击唤醒
def_nfc_payment_component 字符串 NFC支付组件的默认设置
def_add_users_from_lockscreen true, false 是否允许从锁屏添加用户
def_end_button_behavior 整数 (如: 0x2) 结束按钮的行为
def_restrict_background_data true, false 是否限制后台数据
def_backup_manager_constants 字符串 备份管理器常量的默认设置
def_mobile_data_always_on true, false 移动数据是否始终开启
def_backup_local_transport_parameters 字符串 本地传输参数的备份默认设置
def_zen_duration 整数 (如: 0) Zen模式的默认持续时间
def_backup_agent_timeout_parameters 字符串 备份代理超时参数的默认设置
def_vibrate_when_ringing true, false 来电时是否震动
def_apply_ramping_ringer true, false 是否应用逐渐增强的铃声
def_charging_vibration_enabled true, false 充电时是否震动
def_charging_sounds_enabled true, false 充电时是否播放声音
def_notification_bubbles true, false 是否启用通知气泡
def_aware_enabled true, false Aware功能是否启用
def_skip_gesture true, false 是否启用跳过手势
def_silence_gesture true, false 是否启用静音手势
def_aware_lock_enabled true, false Aware锁定功能是否启用
def_hdmiControlAutoDeviceOff true, false HDMI控制自动设备关闭功能是否启用
def_screenshot_button_show 整数 (如: 0) 是否显示截图按钮的默认设置

总结

本文介绍了 Android 11 以上 SettingsProvider DatabaseHelper 的相关知识,包括它的作用、方法、数据表结构、默认设置、不同版本的区别、adb 命令的使用、自定义变量的创建等。

希望本文章能帮助你更好地理解 Android 的 SettingsProviderDatabaseHelper。如果有任何问题或建议,请留言。

相关文章
|
2天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度解析
在移动操作系统的战场上,安卓和iOS一直占据着主导地位。本文将深入探讨这两大平台的核心技术特性,以及它们如何影响用户的体验。我们将从系统架构、应用生态、安全性能和创新功能四个方面进行比较,帮助读者更好地理解这两个系统的异同。
24 3
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
18天前
|
搜索推荐 Java Android开发
安卓与iOS开发差异深度解析
【8月更文挑战第20天】在移动应用开发的广阔舞台上,安卓与iOS这两大操作系统各领风骚,它们在设计理念、开发环境、用户群体等方面展现出各自独特的风貌。本文将深入探讨这两个平台在开发过程中的主要差异,帮助开发者更好地理解并选择适合自己项目需求的平台。
|
20天前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
29 1
|
1月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
72 12
|
7天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
50 0
|
7天前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
17 0
|
16天前
|
测试技术 API Android开发
Android经典实战之简化 Android 相机开发:CameraX 库的全面解析
CameraX是Android Jetpack的一个组件,旨在简化相机应用开发,提供了易于使用的API并支持从Android 5.0(API级别21)起的设备。其主要特性包括广泛的设备兼容性、简洁的API、生命周期感知、简化实现及方便的集成与测试。通过简单的几个步骤即可实现如拍照、视频录制等功能。此外,还提供了最佳实践指导以确保应用的稳定性和性能。
29 0
|
2月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
48 4
|
21天前
|
编译器 Android开发 开发者
Android经典实战之Kotlin 2.0 迁移指南:全方位优化与新特性解析
本文首发于公众号“AntDream”。Kotlin 2.0 已经到来,带来了 K2 编译器、多平台项目支持、智能转换等重大改进。本文提供全面迁移指南,涵盖编译器升级、多平台配置、Jetpack Compose 整合、性能优化等多个方面,帮助开发者顺利过渡到 Kotlin 2.0,开启高效开发新时代。
70 0

热门文章

最新文章

推荐镜像

更多
下一篇
DDNS