版本:2.3.1 
目的:在通话设置菜单下,添加一dect设置菜单,里面再添加一checkBOxPreference 
来使能硬件模块。 
------------------------- 
目前做的项目,需要在系统settings里面添加一选项来使能硬件模块,里面涉及到的preference知识,请网上了解,这里记录下方法。 


1,settings 应用一般在 目录:\packages\apps\Settings,我们先找到通话设置的布局位置,看看它在那个包路径下,进入\packages\apps\Settings\res\xml,打开settings.xml文件: 

android-如何在系统settings里添加设置选项_xml

1. <com.android.settings.IconPreferenceScreen
2. "call_settings"
3. "@drawable/ic_settings_call"
4. "@string/call_settings_title">
5. <intent
6. "android.intent.action.MAIN"
7. "com.android.phone"
8. "com.android.phone.CallFeaturesSetting"
9. </com.android.settings.IconPreferenceScreen>



android:targetPackage="com.android.phone"
android:targetClass="com.android.phone.CallFeaturesSetting"


targetPackage:表示包名,根据此我们可以找到通话设置的路径。 


targetClass:表示此布局文件被那个类所引用,根据此类,我们可以知道在那个文件里面管理我们的通话设置功能。 


2.根据包名,我们可以看到在\packages\apps\Phone 目录下,进入\res\xml目录下 


找到通话布局文件:call_feature_setting.xml,根据类名,很容易找到布局文件。 


里面内容如下: 


android-如何在系统settings里添加设置选项_xml


1. <PreferenceCategory android:key="button_misc_category_key"
2. "@string/other_settings"
3. "false"
4.
5.
6. <!-- Dect settings -->
7. <PreferenceScreen
8.
9. "dect_settings"
10. "@string/dect_module_title"
11. "@string/dect_module_title"
12. <intent
13. "android.intent.action.MAIN"
14. "com.android.phone"
15. "com.android.phone.DectSettings"
16. </PreferenceScreen>
17.
18. <CheckBoxPreference
19. "button_auto_retry_key"
20. "@string/auto_retry_mode_title"
21. "false"
22. "@string/auto_retry_mode_summary"/>

Dect setting 就是新添加进入的设置菜单,我们的原则尽量不大量修改源码,所以添加一个PreferenceScreen,新增一个类文件来管理DECt菜单选项。 



android:targetPackage="com.android.phone" 

android:targetClass="com.android.phone.DectSettings"

 


我们指明了包名,类名后,因这是个activity,所以我们需要到Phone目录下修改 


AndroidManifest.xml文件,指明启动的activity的类名. 


android-如何在系统settings里添加设置选项_xml


1. "CdmaCallOptions"
2. "@string/cdma_options">
3. <intent-filter>
4. "android.intent.action.MAIN"
5. </intent-filter>
6. </activity>
7. <!-- dect activity -->
8. "DectSettings"
9. "@string/dect_module_title">
10. <intent-filter>
11. "android.intent.action.MAIN"
12. </intent-filter>
13. </activity>


3.修改好后,我们必须在此activity里添加preference布局文件。 


  在此目录Phone\res\xml下,新增dect_settings.xml 


android-如何在系统settings里添加设置选项_xml


1. <?xml version="1.0" encoding="utf-8"?>
2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
3. "@string/dect_module_title">
4.
5. <CheckBoxPreference
6. "button_dect_module_key"
7. "@string/dect_module_title"
8. "true"
9. "@string/dect_module_start"
10. "@string/dect_module_stop"
11. />
12.
13. </PreferenceScreen>


好了,总体布局已经完成 


4.在\packages\apps\Phone\src\com\android\phone目录下 


新增DectSettings.java文件 



加载布局文件:       


//dect xml 


addPreferencesFromResource(R.xml.dect_settings);

 


里面涉及到的MidPhoneServce服务,是自己添加的,主要通过此服务的AIDL接口跟硬件打交道。想了解系统服务,请网上查找资料。 



源码如下: 


android-如何在系统settings里添加设置选项_xml

5.编译,烧录。 

1. package
2.
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12. import
13. import
14. import
15. import
16. import
17. import
18. import
19. import
20. import
21. import
22. import
23. import
24. import
25. import
26.
27. public class DectSettings extends
28. private static final String TAG = "DectSettings";
29.
30. private static final String BUTTON_DECT_KEY = "button_dect_module_key";
31.
32. private
33. public IMidPhoneService midphoneservice = null;
34.
35. @Override
36. protected void
37. super.onCreate(icicle);
38.
39. //dect xml
40. addPreferencesFromResource(R.xml.dect_settings);
41.
42. mButtonDect = (CheckBoxPreference)findPreference(BUTTON_DECT_KEY);
43. false);
44.
45. if(mButtonDect != null) {
46.
47. int
48. 1);
49. 0);
50.
51. Settings.System.putInt(getContentResolver(),
52. Settings.System.DECT_SAVED_STATE,dect_state);
53. "settings:------------->"
54. }
55. }
56.
57. @Override
58. public boolean
59. if
60.
61. int dect = mButtonDect.isChecked() ? 1 : 0;
62. boolean
63. if(dect == 1)
64. true;
65. else
66. false;
67. try{
68. "midphone"));
69. Settings.System.putInt(getContentResolver(),
70. Settings.System.DECT_SAVED_STATE,dect);
71. midphoneservice.setDectEnabled(state);
72.
73. "settings:------------->"
74. catch
75. e.printStackTrace();
76. }
77. return true;
78. }
79. return false;
80. }
81.
82. @Override
83. protected void
84. super.onResume();
85.
86. if (mButtonDect != null) {
87. mButtonDect.setChecked(Settings.System.getInt(
88. getContentResolver(),
89. 1) != 0);
90. }
91. }
92. }


# . build/envsetup.sh 


执行 # mmm packages/apps/Phone/ 


会在\out\target\product\generic\system\app 生成 Phone.apk文件 


拷贝 此apk到 \out\target\product\smdkv210\system\app 目录下 


编译就行: ./build_android 


此时,才能看到修改的效果!