给android添加系统属性:Settings.system和SystemProperties

本文介绍了两种给Android系统添加自定义属性的方法:通过Settings.System和SystemProperties。Settings.System用于实现如飞行模式开关等功能,并保存到系统数据库;SystemProperties则用于设置只读或持久化的系统属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址为: 给android添加系统属性:Settings.system和SystemProperties

SystemPropertiesSettings.System

 

1 使用 SystemProperties.get
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
  如果属性名称以“ persist.”开头,当设置这个属性时,其值也将写入/data/property。
 
在c++中就是对应JAVA的两个函数就是property_set, property_get,其实JAVA是通过JNI调用这两个函数的。

JAVA代码如下:

import android.os.SystemProperties;

SystemProperties.set("persist.sys.language", zone.getID());
String lang= SystemProperties.get("persist.sys.language");

获取方法:

boolean fastfoodenable = SystemProperties.getBoolean("persist.sys.fastfoodenable", false);

设置方法:

SystemProperties.set("persist.sys.fastfoodenable", "true");
  

C

#include <cutils/properties.h>

property_set("persist.sys.language", "zh");
property_get("persist.sys.language", propLang, "en");

在adb shell可以通过以下的命名读取和修改

#getprop  persist.sys.language
#setprop   persist.sys.language  zh

 

创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是android属性的名称是有一定的格式要求的,如下: 前缀必须用system\core\init\property_service.c中定义的前缀 ,进行系统属性设置的程序也必须有system或root权限

如果我们要添加一个property:例如:silvan_liu

路径:system/core/rootdir/int.rc

在on post-fs-data 目录下

 setprop persist.sys.silvan_liu 1//persist.sys 前缀名; 1为初始值

PS:不同前缀名权限不同,这里就不一一说明;还有为什么要加载on post-fs-data目录下,这和int.rc的语法有关

 

 

 

2 使用 Settings.System.putInt 

这种方式会保存变量到Settings 数据库中,飞行模式等的开关就是用这种方式实现的。

首先需要定义一个系统属性值

路径:frameworks/base/core/java/android/provider/Settings.java

public static final String VIVIEN_FASTFOOD= "hungry";  

1)获取方法如下:

@Override

    public void onResume()

    {

      super.onResume();

      if(Settings.System.getInt(getContentResolver(), Settings.System.VIVIEN_FASTFOOD,0)==1)

       {

      mYesORNo.setChecked(true);

       }

      else

      mYesORNo.setChecked(false);

    }
2)设置

if (mYesORNo.isChecked()) {

              Settings.System.putInt(getContentResolver(),

                     Settings.System.VIVIEN_FASTFOOD, 1);

           } else {

              Settings.System.putInt(getContentResolver(),

                     Settings.System.VIVIEN_FASTFOOD, 0);

           }

 

需要import android.provider.Settings;

____________________________________________________________________________________

 

from:http://blog.youkuaiyun.com/k1102k27/article/details/7106124

android源码开发中,常常要用到一些全局标志或者说变量,这时候我们可以给android系统添加自己想要的属性。

1.Settings.system

这种系统属性我们经常用到,例如飞行模式的开启和关闭,我们就是去改变Settings.system.AIRPLANE_MODE_ON 的值。

下面就介绍下我们怎样去定义一个系统属性。例如要添加一个属性名为“SILVAN_LIU”

路径:frameworks/base/core/java/android/provider/Settings.java

 

[java]  view plain copy
 
  1. public static final String SILVAN_LIU = "silvan_liu";  
  2.  public static final String[] SETTINGS_TO_BACKUP ={  
  3.             ~  
  4.        +SILVAN_LIU  
  5.               ~     
  6. }  

这样添加后,你就是可以通过Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0) 和Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0)去得到和设定SILVAN_LIU的属性值。

 

2.SystemProperties

创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是android属性的名称是有一定的格式要求的,如下: 前缀必须用system\core\init\property_service.c中定义的前缀 ,进行系统属性设置的程序也必须有system或root权限

如果我们要添加一个property:例如:silvan_liu

路径:system/core/rootdir/int.rc

在on post-fs-data 目录下

 setprop persist.sys.silvan_liu 1//persist.sys 前缀名; 1为初始值

PS:不同前缀名权限不同,这里就不一一说明;还有为什么要加载on post-fs-data目录下,这和int.rc的语法有关。

 

以上是我实际项目中运用到的地方,可能认识的不够深刻,还需继续摸索。


转载请注明本文地址: 给android添加系统属性:Settings.system和SystemProperties
<think>我们正在处理一个关于Android系统设置默认值的问题。用户想知道在刷机时如何设置Settings.System的默认值。根据提供的引用,我们可以总结出以下方法: 1. **修改系统属性文件(default.xml)**:在Android系统中,可以通过在`default.xml`文件中添加字段的默认值来设置系统设置的初始值。编译系统后刷机,新增的设置字段就会生效(引用[1])。 2. **通过代码在系统启动时设置默认值**:在特定的系统广播接收器(如`RestoreRotationReceiver`)中,可以在系统启动时(或其他时机)通过代码设置默认值。例如,在`onReceive`方法中使用`Settings.Global.putInt`来设置全局设置的默认值(引用[2])。 3. **了解系统设置的存储位置**:系统设置(包括Settings.System)的存储位置,例如WiFi蓝牙的配置信息存储在特定的XML文件中(引用[3])。但请注意,这些文件通常是在系统运行时生成的,而不是在刷机时直接设置。 对于刷机时设置Settings.System的默认值,最常用的方法是修改`default.xml`文件(通常位于`/packages/apps/Settings/res/values/`目录下)。因为Settings.System的设置属于系统设置,所以可以在该文件中添加`<integer>`, `<string>`, `<bool>`等类型的设置项。 **具体步骤**: 1. 找到`default.xml`文件(路径可能因Android版本而异,常见路径为`packages/apps/Settings/res/values/defaults.xml`或类似路径)。 2. 在文件中添加你需要的设置项。例如,要设置一个名为`screen_brightness`的整型默认值为100,可以添加: ```xml <integer name="screen_brightness">100</integer> ``` 3. 重新编译系统并刷机。 另外,如果设置项是系统属性System Properties),也可以通过`init`进程或`system_properties`文件来设置,但Settings.System通常不直接使用系统属性,而是通过ContentProvider存储在数据库中。 **注意**:在Android高版本中,有些设置可能被迁移到Settings.Global或Settings.Secure中,需要根据设置的类型选择正确的范围。Settings.System用于用户可修改的系统设置,如亮度、音量等。 **示例代码**(在`default.xml`中添加设置): ```xml <resources> ... 其他默认设置 ... <!-- 屏幕亮度默认值 --> <integer name="screen_brightness">100</integer> <!-- 是否开启自动旋转 --> <bool name="accelerometer_rotation">true</bool> </resources> ``` **另一种方法**:在系统启动时通过代码设置。例如,在系统启动完成的广播接收器中设置: ```java public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 设置Settings.System的默认值 Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 100); } } ``` 但这种方法需要在每次启动时都执行,且可能会被用户后续修改。 **总结**:刷机时设置默认值推荐使用修改`default.xml`文件的方法,因为这是系统初始化的默认值,不会在每次启动时覆盖用户设置(除非恢复出厂设置)。 §§相关问题§§ 1. 如何为Android系统添加一个新的设置项? 2.Android高版本中,修改系统默认设置的方法有什么变化? 3. Settings.System, Settings.GlobalSettings.Secure有什么区别?</think>### 如何在刷机时设置 Android Settings.System 默认值 在 Android 系统开发中,设置 Settings.System 的默认值主要通过以下两种方法实现: #### 方法 1:修改 default.xml 配置文件(推荐) 这是最标准的设置默认值方式,修改后需重新编译系统: 1. 定位配置文件: `packages/apps/Settings/res/values/defaults.xml` 2. 添加默认值条目: ```xml <integer name="screen_brightness">80</integer> <!-- 屏幕亮度默认值 --> <bool name="haptic_feedback_enabled">true</bool> <!-- 触感反馈开关 --> ``` 3. 编译刷机: 修改后重新编译系统镜像并刷机,新设置项会自动生效[^1]。 > **原理**:系统首次启动时,`SettingsProvider` 会读取这些默认值写入系统数据库 `/data/system/users/0/settings_system.xml`[^3]。 #### 方法 2:在系统服务中动态设置 通过广播接收器在系统启动时注入默认值: ```java // 在系统服务(如 SystemUI)中添加 public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 设置屏幕旋转默认值 Settings.System.putInt( context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1 // 1=启用, 0=禁用 ); // 设置USB调试默认开启 Settings.Global.putInt( context.getContentResolver(), Settings.Global.ADB_ENABLED, 1 )[^2]; } } ``` > **注意**:需在 `AndroidManifest.xml` 注册 `BOOT_COMPLETED` 广播权限。 --- ### 关键注意事项 1. **作用域区分**: - `Settings.System`:用户级系统设置(亮度、铃声等) - `Settings.Global`:设备级全局设置(调试模式等) - `Settings.Secure`:安全敏感设置(位置服务等) 2. **存储位置**: ```bash /data/system/users/0/settings_system.xml # System设置 /data/misc/apexdata/com.android.settings/ # 高版本全局设置[^3] ``` 3. **版本兼容**: - Android 5.0+ 需检查 SELinux 策略 - Android 10+ 推荐使用 `DeviceConfig` API - 动态设置方法在高版本可能受限[^1] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值