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月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
2月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
64 0
|
3月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
40 3
|
3月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
77 4
|
3月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
63 6
|
2月前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
65 0
|
3月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
491 0

热门文章

最新文章

推荐镜像

更多