android P 添加自定义系统属性,并监听变化
16lz
2021-01-26
在系统中设置添加一个控制扫码使能开关,在其他地方可以获取这个值,并根据这个值做相关处理。
1.添加自定义属性变量名
修改: /frameworks/base/core/java/android/provider/Settings.java
public static final class System extends NameValueTable { ... 1. 添加变量名称 /** * add by wxd for qrscan */ public static final String QRSCAN_MODE = "qrscan_mode"; private static final Validator QRSCAN_MODE_VALIDATOR = BOOLEAN_VALIDATOR; // 不加这个编译不过 ... 2. SETTINGS_TO_BACKUP中添加 public static final String[] SETTINGS_TO_BACKUP = { QRSCAN_MODE, STAY_ON_WHILE_PLUGGED_IN, // moved to global ... 3. PUBLIC_SETTINGS中添加 public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>(); static { PUBLIC_SETTINGS.add(QRSCAN_MODE); PUBLIC_SETTINGS.add(END_BUTTON_BEHAVIOR); ... 4. VALIDATORS中添加 public static final Map<String, Validator> VALIDATORS = new ArrayMap<>(); static { VALIDATORS.put(QRSCAN_MODE, QRSCAN_MODE_VALIDATOR); ...
2.添加新文件QrScanPreferenceController,改变值并发出通知
添加: vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/security/QrScanPreferenceController.java
package com.android.settings.security; import android.content.Context; import android.os.UserHandle; import android.provider.Settings; import com.android.internal.widget.LockPatternUtils; import com.android.settings.core.TogglePreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settings.R; public class QrScanPreferenceController extends TogglePreferenceController { private Context mContext; private static final String KEY_QRSCAN_SETTING = "qrscan_setting"; private static final String QRSCAN_SETTING_ENABLE = "key_qrscan_setting"; private int QRSCAN_ON = 1; // 打开 private int QRSCAN_OFF = 0; // 关闭 public QrScanPreferenceController(Context context) { super(context, KEY_QRSCAN_SETTING); mContext = context; } @Override public boolean isChecked() { return Settings.System.getInt(mContext.getContentResolver(), Settings.System.QRSCAN_MODE, QRSCAN_ON ) != QRSCAN_ON ; } @Override public boolean setChecked(boolean isChecked) { Settings.System.putInt(mContext.getContentResolver(), Settings.System.QRSCAN_MODE, isChecked ? QRSCAN_ON : QRSCAN_ON ); mContext.getContentResolver().notifyChange(Settings.System.getUriFor( Settings.System.QRSCAN_MODE),null); // 发出通知QRSCAN_MODE的值发生变化 return true; } @Override public int getAvailabilityStatus() { return AVAILABLE; // 其他值不会显示 } }
3.加入到Setting的布局中
添加: /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/security_dashboard_settings.xml
<SwitchPreference android:key="qrscan_setting" android:title="@string/qrscan_setting" android:summary="@string/qrscan_setting_summery" settings:controller="com.android.settings.security.QrScanPreferenceController"/>
添加: /vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/security/SecuritySettings.java
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, Lifecycle lifecycle, SecuritySettings host) { ... controllers.add(new QrScanPreferenceController(context)); return controllers; }
3.注册ContentObserver,值发生变化时得到通知
添加: /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { // Observe all users' changes ContentResolver resolver = mContext.getContentResolver(); ... resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.QRSCAN_MODE), false, this, UserHandle.USER_ALL); // add by wxd updateSettings(); } @Override public void onChange(boolean selfChange) { // 值发生变化 int qrscanMode = Settings.System.getInt(mContext.getContentResolver(),Settings.System.QRSCAN_MODE, 1); }}
更多相关文章
- android hasSystemFeature函数及系统特性配置
- Android(安卓)ListView的OnItemClickListener详解
- GreenDao数据库升级解决方案
- Android(安卓)7.0导航栏上添加图标
- Android(安卓)程式开发:(二十)内容提供者 —— 20.6 自定义ContentP
- Android原生分享图片和视频
- Google Map API V2
- Android(安卓)NDK开发之旅38--FFmpeg视频添加水印
- Android(安卓)ApiDemos示例解析(179):Views->Lists->12. Transcr