android-如何在系統settings裏添加設置選項

版本:2.3.1
目的:在通話設置菜單下,添加一dect設置菜單,裏面再添加一checkBOxPreference
來使能硬件模塊。
-------------------------
目前作的項目,須要在系統settings裏面添加一選項來使能硬件模塊,裏面涉及到的preference知識,請網上了解,這裏記錄下方法。


1,settings 應用通常在 目錄:\packages\apps\Settings,咱們先找到通話設置的佈局位置,看看它在那個包路徑下,進入\packages\apps\Settings\res\xml,打開settings.xml文件:
Java代碼 複製代碼  收藏代碼
  1. <com.android.settings.IconPreferenceScreen   
  2.     android:key="call_settings"  
  3.     settings:icon="@drawable/ic_settings_call"  
  4.     android:title="@string/call_settings_title">   
  5.     <intent   
  6.         android:action="android.intent.action.MAIN"  
  7.         android:targetPackage="com.android.phone"  
  8.         android:targetClass="com.android.phone.CallFeaturesSetting" />   
  9. </com.android.settings.IconPreferenceScreen>  
<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,根據類名,很容易找到佈局文件。
裏面內容以下:
Java代碼 複製代碼  收藏代碼
  1. <PreferenceCategory android:key="button_misc_category_key"  
  2.         android:title="@string/other_settings"  
  3.         android:persistent="false" />   
  4.            
  5.   
  6. <!-- Dect settings -->   
  7.     <PreferenceScreen   
  8.            
  9.         android:key="dect_settings"  
  10.         android:title="@string/dect_module_title"  
  11.         android:summary="@string/dect_module_title" >   
  12.         <intent   
  13.             android:action="android.intent.action.MAIN"  
  14.             android:targetPackage="com.android.phone"  
  15.             android:targetClass="com.android.phone.DectSettings" />               
  16.     </PreferenceScreen>   
  17.        
  18.     <CheckBoxPreference   
  19.         android:key="button_auto_retry_key"  
  20.         android:title="@string/auto_retry_mode_title"  
  21.         android:persistent="false"  
  22.         android:summary="@string/auto_retry_mode_summary"/>  
<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的類名.
Java代碼 複製代碼  收藏代碼
  1.       <activity android:name="CdmaCallOptions"  
  2.           android:label="@string/cdma_options">   
  3.           <intent-filter>   
  4.               <action android:name="android.intent.action.MAIN" />   
  5.           </intent-filter>   
  6.       </activity>   
  7. <!-- dect activity -->   
  8.       <activity android:name="DectSettings"  
  9.           android:label="@string/dect_module_title">   
  10.           <intent-filter>   
  11.               <action android:name="android.intent.action.MAIN" />   
  12.           </intent-filter>   
  13.       </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">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

3.修改好後,咱們必須在此activity裏添加preference佈局文件。
  在此目錄Phone\res\xml下,新增dect_settings.xml
Java代碼 複製代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"  
  3.         android:title="@string/dect_module_title">   
  4.            
  5.       <CheckBoxPreference   
  6.         android:key="button_dect_module_key"  
  7.         android:title="@string/dect_module_title"  
  8.         android:defaultValue="true"  
  9.         android:summaryOn="@string/dect_module_start"  
  10.         android:summaryOff="@string/dect_module_stop"  
  11.         />     
  12.   
  13. </PreferenceScreen>  
<?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:title="@string/dect_module_title"
        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接口跟硬件打交道。想了解系統服務,請網上查找資料。

源碼以下:
Java代碼 複製代碼  收藏代碼
  1. package com.android.phone;   
  2.   
  3. import android.content.DialogInterface;   
  4. import android.os.AsyncResult;   
  5. import android.os.Bundle;   
  6. import android.os.Handler;   
  7. import android.os.Message;   
  8. import android.preference.CheckBoxPreference;   
  9. import android.preference.Preference;   
  10. import android.preference.PreferenceActivity;   
  11. import android.preference.PreferenceScreen;   
  12. import android.content.SharedPreferences;   
  13. import android.content.SharedPreferences.Editor;   
  14. import android.content.pm.ActivityInfo;   
  15. import android.content.pm.PackageManager;   
  16. import android.content.pm.ResolveInfo;   
  17. import android.os.Bundle;   
  18. import android.os.Handler;   
  19. import android.util.Log;   
  20. import android.content.Context;   
  21. import com.android.phone.R;   
  22. import android.os.IMidPhoneService;   
  23. import android.os.RemoteException;   
  24. import android.os.ServiceManager;   
  25. import android.provider.Settings;   
  26.   
  27. public class DectSettings extends PreferenceActivity {   
  28.     private static final String TAG = "DectSettings";   
  29.      
  30.     private static final String BUTTON_DECT_KEY  = "button_dect_module_key";   
  31.        
  32.     private CheckBoxPreference mButtonDect;   
  33.     public IMidPhoneService midphoneservice = null;   
  34.   
  35.     @Override  
  36.     protected void onCreate(Bundle icicle) {   
  37.         super.onCreate(icicle);   
  38.   
  39.             //dect xml   
  40.         addPreferencesFromResource(R.xml.dect_settings);   
  41.   
  42.         mButtonDect = (CheckBoxPreference)findPreference(BUTTON_DECT_KEY);   
  43.         mButtonDect.setPersistent(false);   
  44.   
  45.         if(mButtonDect != null) {   
  46.                
  47.             int dect_state = Settings.System.getInt(   
  48.                 getContentResolver(),Settings.System.DECT_SAVED_STATE, 1);   
  49.             mButtonDect.setChecked( dect_state!= 0);   
  50.                
  51.             Settings.System.putInt(getContentResolver(),   
  52.                         Settings.System.DECT_SAVED_STATE,dect_state);   
  53.             Log.e(TAG,"settings:------------->" + dect_state);   
  54.         }   
  55.     }   
  56.   
  57.     @Override  
  58.     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {   
  59.         if (preference == mButtonDect ) {   
  60.   
  61.             int dect = mButtonDect.isChecked() ? 1 : 0;        
  62.             boolean state;   
  63.             if(dect == 1)   
  64.                 state = true;   
  65.             else  
  66.                 state = false;   
  67.             try{   
  68.                     midphoneservice = IMidPhoneService.Stub.asInterface(ServiceManager.getService("midphone"));   
  69.                     Settings.System.putInt(getContentResolver(),   
  70.                         Settings.System.DECT_SAVED_STATE,dect);   
  71.                     midphoneservice.setDectEnabled(state);   
  72.   
  73.                     Log.e(TAG,"settings:------------->" + dect);   
  74.                 } catch (RemoteException e) {   
  75.                     e.printStackTrace();   
  76.                 }   
  77.             return true;   
  78.         }   
  79.         return false;   
  80.     }   
  81.        
  82.   @Override  
  83.     protected void onResume() {   
  84.         super.onResume();   
  85.   
  86.         if (mButtonDect != null) {   
  87.             mButtonDect.setChecked(Settings.System.getInt(   
  88.                 getContentResolver(),   
  89.                 Settings.System.DECT_SAVED_STATE, 1) != 0);   
  90.         }   
  91.     }   
  92. }  
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.os.Bundle;
import android.os.Handler;
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);
		}
    }

    @Override
    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 此時,才能看到修改的效果!
相關文章
相關標籤/搜索