美文网首页
Android10添加系统数据库Settings.Global字

Android10添加系统数据库Settings.Global字

作者: DD_Dog | 来源:发表于2022-11-04 10:06 被阅读0次

项目中有时候需要保存一些永久变量,使用系统数据库是一个好的选择,但是如果该变量需要在第三方APP中访问,就还需要解决要解决权限问题。

下面以变量notification_panel_enable,bool类型为例

一、添加变量

首先要进行变量初始化,一般位于SettingsProvider

定义变量,方便引用

diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
public final class Settings {
          */
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/global");
 
+               //bianjb 状态栏下拉开关
+        public static final String NOTIFICATION_PANEL_ENABLE = "notification_panel_enable"; 
+

初始化变量

diff --git a/packages/SettingsProvider/res/values/defaults.xml 
 <resources>
+       <!--bianjb 添加状态栏下拉开关 -->
+    <bool name="notification_panel_enable">true</bool>

diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 
class DatabaseHelper extends SQLiteOpenHelper {
         try {
             stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
                     + " VALUES(?,?);");
+                       //bianjb 添加状态栏下拉开关
+            loadBooleanSetting(stmt, Settings.Global.NOTIFICATION_PANEL_ENABLE,
+                    R.bool.notification_panel_enable);

二、解决第三方APP读写的权限问题

diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java 
@@ -1249,18 +1250,23 @@ public class SettingsProvider extends ContentProvider {
     private boolean mutateGlobalSetting(String name, String value, String tag,
             boolean makeDefault, int requestingUserId, int operation, boolean forceNotify,
             int mode) {
-        // Make sure the caller can change the settings - treated as secure.
 -       enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);
         
       
         String pkg = "com.android.settings"; //数据写入时使用系统settings应用的包名,系统会进行调用进程的包名判断
         if(!"notification_panel_enable".equals(name)){  //bianjb 自定义数据不进行权限验证
              pkg = "";
              // Make sure the caller can change the settings - treated as secure.
              enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);
            }

//下面修改在插入操作时使用上面预设的包名,绕过包名验证
@@ -1268,7 +1274,7 @@ public class SettingsProvider extends ContentProvider {
                 case MUTATION_OPERATION_INSERT: {
                     return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_GLOBAL,
                             UserHandle.USER_SYSTEM, name, value, tag, makeDefault,
-                            getCallingPackage(), forceNotify, CRITICAL_GLOBAL_SETTINGS);
+                            "".equals(pkg)?getCallingPackage():pkg, forceNotify,  CRITICAL_GLOBAL_SETTINGS);
                 }

三、变量读写

//写
Settings.Global.putInt(mContext.getContentResolver(),Settings.Global.NOTIFICATION_PANEL_ENABLE,1);
 //读
Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.NOTIFICATION_PANEL_ENABLE, 1)

相关文章

网友评论

      本文标题:Android10添加系统数据库Settings.Global字

      本文链接:https://www.haomeiwen.com/subject/mqmytdtx.html