版本:2.3.1
目的:在通話設定菜單下,添加一dect設定菜單,裡面再添加一checkboxpreference
來使能硬體子產品。
-------------------------
目前做的項目,需要在系統settings裡面添加一選項來使能硬體子產品,裡面涉及到的preference知識,請網上了解,這裡記錄下方法。
1,settings 應用一般在 目錄:\packages\apps\settings,我們先找到通話設定的布局位置,看看它在那個包路徑下,進入\packages\apps\settings\res\xml,打開settings.xml檔案:
java代碼

<com.android.settings.iconpreferencescreen
android:key="call_settings"
settings:icon="@drawable/ic_settings_call"
android:title="@string/call_settings_title">
<intent
android:action="android.intent.action.main"
android:targetpackage="com.android.phone"
android:targetclass="com.android.phone.callfeaturessetting" />
</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,根據類名,很容易找到布局檔案。
裡面内容如下:

<preferencecategory android:key="button_misc_category_key"
android:title="@string/other_settings"
android:persistent="false" />
<!-- dect settings -->
<preferencescreen
android:key="dect_settings"
android:title="@string/dect_module_title"
android:summary="@string/dect_module_title" >
<intent
android:action="android.intent.action.main"
android:targetpackage="com.android.phone"
android:targetclass="com.android.phone.dectsettings" />
</preferencescreen>
<checkboxpreference
android:key="button_auto_retry_key"
android:title="@string/auto_retry_mode_title"
android:persistent="false"
android:summary="@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的類名.

<activity android:name="cdmacalloptions"
android:label="@string/cdma_options">
<intent-filter>
<action android:name="android.intent.action.main" />
</intent-filter>
</activity>
<!-- dect activity -->
<activity android:name="dectsettings"
android:label="@string/dect_module_title">
3.修改好後,我們必須在此activity裡添加preference布局檔案。
在此目錄phone\res\xml下,新增dect_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<preferencescreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/dect_module_title">
<checkboxpreference
android:key="button_dect_module_key"
android:defaultvalue="true"
android:summaryon="@string/dect_module_start"
android:summaryoff="@string/dect_module_stop"
/>
</preferencescreen>
好了,總體布局已經完成
4.在\packages\apps\phone\src\com\android\phone目錄下
新增dectsettings.java檔案
加載布局檔案:
//dect xml
addpreferencesfromresource(r.xml.dect_settings);
裡面涉及到的midphoneservce服務,是自己添加的,主要通過此服務的aidl接口跟硬體打交道。想了解系統服務,請網上查找資料。
源碼如下:

package com.android.phone;
import android.content.dialoginterface;
import android.os.asyncresult;
import android.os.bundle;
import android.os.handler;
import android.os.message;
import android.preference.checkboxpreference;
import android.preference.preference;
import android.preference.preferenceactivity;
import android.preference.preferencescreen;
import android.content.sharedpreferences;
import android.content.sharedpreferences.editor;
import android.content.pm.activityinfo;
import android.content.pm.packagemanager;
import android.content.pm.resolveinfo;
import android.util.log;
import android.content.context;
import com.android.phone.r;
import android.os.imidphoneservice;
import android.os.remoteexception;
import android.os.servicemanager;
import android.provider.settings;
public class dectsettings extends preferenceactivity {
private static final string tag = "dectsettings";
private static final string button_dect_key = "button_dect_module_key";
private checkboxpreference mbuttondect;
public imidphoneservice midphoneservice = null;
@override
protected void oncreate(bundle icicle) {
super.oncreate(icicle);
//dect xml
addpreferencesfromresource(r.xml.dect_settings);
mbuttondect = (checkboxpreference)findpreference(button_dect_key);
mbuttondect.setpersistent(false);
if(mbuttondect != null) {
int dect_state = settings.system.getint(
getcontentresolver(),settings.system.dect_saved_state, 1);
mbuttondect.setchecked( dect_state!= 0);
settings.system.putint(getcontentresolver(),
settings.system.dect_saved_state,dect_state);
log.e(tag,"settings:------------->" + dect_state);
}
}
public boolean onpreferencetreeclick(preferencescreen preferencescreen, preference preference) {
if (preference == mbuttondect ) {
int dect = mbuttondect.ischecked() ? 1 : 0;
boolean state;
if(dect == 1)
state = true;
else
state = false;
try{
midphoneservice = imidphoneservice.stub.asinterface(servicemanager.getservice("midphone"));
settings.system.putint(getcontentresolver(),
settings.system.dect_saved_state,dect);
midphoneservice.setdectenabled(state);
log.e(tag,"settings:------------->" + dect);
} catch (remoteexception e) {
e.printstacktrace();
}
return true;
return false;
@override
protected void onresume() {
super.onresume();
if (mbuttondect != null) {
mbuttondect.setchecked(settings.system.getint(
getcontentresolver(),
settings.system.dect_saved_state, 1) != 0);
}
5.編譯,燒錄。
# . build/envsetup.sh
執行 # mmm packages/apps/phone/
會在\out\target\product\generic\system\app 生成 phone.apk檔案
拷貝 此apk到 \out\target\product\smdkv210\system\app 目錄下
編譯就行: ./build_android
此時,才能看到修改的效果!