天天看點

android-如何在系統settings裡添加設定選項

版本:2.3.1 

目的:在通話設定菜單下,添加一dect設定菜單,裡面再添加一checkboxpreference 

來使能硬體子產品。 

------------------------- 

目前做的項目,需要在系統settings裡面添加一選項來使能硬體子產品,裡面涉及到的preference知識,請網上了解,這裡記錄下方法。 

1,settings 應用一般在 目錄:\packages\apps\settings,我們先找到通話設定的布局位置,看看它在那個包路徑下,進入\packages\apps\settings\res\xml,打開settings.xml檔案: 

java代碼  

android-如何在系統settings裡添加設定選項

<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,根據類名,很容易找到布局檔案。 

裡面内容如下: 

android-如何在系統settings裡添加設定選項

<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的類名. 

android-如何在系統settings裡添加設定選項

      <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 

android-如何在系統settings裡添加設定選項

<?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接口跟硬體打交道。想了解系統服務,請網上查找資料。 

源碼如下: 

android-如何在系統settings裡添加設定選項

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 

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

繼續閱讀