android Settings 增加一个preference显示序列号

85 阅读2分钟

settings 里面使用preference做显示,首先要了解preference是怎样一个库。以下是preference介绍:
androidx.preference.Preference 是 AndroidX 库中用于构建应用设置界面的核心类,提供了统一的偏好设置组件(如开关、输入框、列表选择等),支持自动持久化存储(默认存储在 SharedPreferences),并简化设置界面的开发流程


现在在android settings里面加一个序列号显示;这里面重要的是PreferenceController的用法,需要注意两个函数

  • xml的Preference里的key要与PreferenceControllerd对应起来 比如下发的key="custom_device_sn"super(context, "custom_device_sn");相对应
  • updateState 在这里初始设置summary值
  • onPreferenceChange 当有变化时,在这里更新summary值

diff --git a/packages/apps/Settings/res/xml/my_device_info.xml b/packages/apps/Settings/res/xml/my_device_info.xml
index 9547318a86..3dd0b2461e 100644
--- a/packages/apps/Settings/res/xml/my_device_info.xml
+++ b/packages/apps/Settings/res/xml/my_device_info.xml
@@ -209,6 +209,13 @@
             android:summary="@string/summary_placeholder"
             settings:enableCopying="true"
             settings:controller="com.android.settings.deviceinfo.BuildNumberPreferenceController"/>
+             <Preference
+            android:key="custom_device_sn"
+            android:order="54"
+            android:title="序列号"
+            android:summary="@string/summary_placeholder"
+            android:selectable="false"
+            settings:enableCopying="true"/>
     </PreferenceCategory>

 </PreferenceScreen>
diff --git a/packages/apps/Settings/src/com/android/settings/deviceinfo/CustomDeviceSnPreferenceController.java b/packages/apps/Settings/src/com/android/settings/deviceinfo/CustomDeviceSnPreferenceController.java
new file mode 100755
index 0000000000..51e5cb42df
--- /dev/null
+++ b/packages/apps/Settings/src/com/android/settings/deviceinfo/CustomDeviceSnPreferenceController.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.deviceinfo;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import com.google.common.primitives.Ints;
+
+import java.util.Optional;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+/** Preference controller that controls the preferred location in accessibility button page. */
+public class CustomDeviceSnPreferenceController extends BasePreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+
+
+    public CustomDeviceSnPreferenceController(Context context) {
+        super(context, "custom_device_sn");
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+
+        File file = new File("/system/etc/jiancang_serial_code");
+        StringBuilder fileContent = new StringBuilder();
+        if (file == null || !file.exists()){
+            fileContent.append("");
+        }else{
+            BufferedReader reader = null;
+            try {
+                InputStreamReader is = new InputStreamReader(new FileInputStream(file), "utf-8");
+                reader = new BufferedReader(is);
+                String line = null;
+                while ((line = reader.readLine()) != null) {
+                    fileContent.append(line);
+                }
+
+            }catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                if (reader != null) {
+                    try {
+                        reader.close();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+
+       preference.setSummary(fileContent.toString());
+    }
+
+
+}
diff --git a/packages/apps/Settings/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/packages/apps/Settings/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index 4af5d79c37..f6dce1d032 100644
--- a/packages/apps/Settings/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/packages/apps/Settings/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -39,6 +39,7 @@ import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController;
 import com.android.settings.deviceinfo.SafetyInfoPreferenceController;
 import com.android.settings.deviceinfo.UptimePreferenceController;
 import com.android.settings.deviceinfo.WifiMacAddressPreferenceController;
+import com.android.settings.deviceinfo.CustomDeviceSnPreferenceController;
 import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController;
 import com.android.settings.deviceinfo.simstatus.SimStatusPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -113,6 +114,7 @@ public class MyDeviceInfoFragment extends DashboardFragment
         controllers.add(new FeedbackPreferenceController(fragment, context));
         controllers.add(new FccEquipmentIdPreferenceController(context));
         controllers.add(new UptimePreferenceController(context, lifecycle));
+        controllers.add(new CustomDeviceSnPreferenceController(context));
         return controllers;
     }