1. 程式人生 > >Android系統應用開發(四)系統語言以及新增字型庫

Android系統應用開發(四)系統語言以及新增字型庫

1.如何向android的setting語言列表中新增一門語言

第一種:修改配置檔案
位置:build/target/product/languages_full.mk| languages_small.mk,這兩個檔案裡頭,有PRODUCT_LOCALES := en_US en_GB fr_FR it_IT es_ES es_US 這樣的片段,其實setting中語言選擇列表的資料來源頭就來源於此,既然找到了源頭,那隻要在之後加上想要的語言即可,比如要加越南語 只要在後面加上 “vi_VN”即可。裡面都有PRODUCT_LOCALES :=這樣的片段,從命名上也可發現一個full一個small,當不需要更多的語言時候,那languages_small.mk裡面的語言就可以滿足,而且語言少,生成的image所佔用的空間也會相對小些,是根據同目錄下full.mk裡的註釋“Get a list of languages. We use the small list to save space on smaller devices.”。一個full.mk的檔案,這裡面有這樣的片段:$(call inherit-product, build/target/product/languages_small.mk),後者路徑就是我們要設定的地方。好了,改好後,得整個make下,好多模組都是重新編譯。

第二種:編碼方式修改
Android裡一個listview會對應一個數據陣列,那隻需在這個數組裡按格式新增所需要的資料就行了,目標是com.android.settings.LocalePicker.java,在該檔案133行位置做如下修改:

mLocales = new Loc[finalSize+1];
for (int i = 0; i < finalSize ; i++) {
mLocales = preprocess;
}
Locale temp = new Locale("vi", "VN");
mLocales[finalSize] =new Loc(toTitleCase(temp.getDisplayLanguage(temp)), temp);

2.安卓系統新增字型庫

由於專案需要,需要將第三方提供的.ttf字型檔檔案編譯至系統原始碼中,在百度上找了好久,都沒有找到想要的,最後還是Google解決了問題,這裡作下記錄。
(一)首先說怎麼把字型庫新增到裝置
Reference: 
http://stackoverflow.com/questions/9627806/android-add-custom-fonts-to-system
其實Reference 中介紹的方法,已經非常簡單明瞭,無需贅述,但這裡還是將自己的實踐記錄一下,順便備註一下需要注意的地方,方便自己以後查閱學習。

Step1:
Copy custom font .ttf into frameworks/base/data/fonts
很簡單,就是copy待新增的 Xxx.ttf 檔案到 ../LINUX/Android/frameworks/base/data/fonts 目錄下
Step2:
Modify framworks/base/data/fonts/Android.mk ,Add your custom font into list of ‘font_src_files’

修改同目錄下的Android.mk檔案,將Xxx.ttf檔案新增到‘font_src_files ’,具體如下:

font_src_files := \ 
Roboto-Regular.ttf \ 
…. 
AndroidClock_Solid.ttf \ 
Xxx.ttf \
這裡要注意的是,‘font_src_files’在Android.mk檔案中有多處定義,要注意比對,不要找錯位置,一般在上面那段程式碼上面會有一段如下的註釋:
# Build the rest of font files as prebuilt. 
# $(1): The source file name in LOCAL_PATH. 
# It also serves as the module name and the dest file name.

相信如果看明白了這段註釋,也就該大概知道新增在這裡的原因了吧。

Step3:
Modify frameworks/base/data/fonts/fonts.mk ,Add your custom font into list of PRODUCT_PACKAGES
修改同目錄下的fonts.mk檔案,在PRODUCT_PACKAGES末尾新增Xxx.ttf檔案,如下:
PRODUCT_PACKAGES := \ 
DroidSansFallback.ttf \ 
… 
AndroidClock_Solid.ttf \ 
Xxx.ttf \
Step4:
在frameworks/base/data/fonts$ 單編,執行mm
Step5:
Check 是否成功
Rebuild 之後,如果編譯成功,在out/target/product/msm8610/system/fonts 會有Xxx.ttf檔案,反之則可能並未成功。 
注意:/product 下的/msm8610 這個目錄跟平臺有關,不同的平臺會是不同的目錄,例如有可能是 
out/target/product/generic/system/fonts 等。
Step6:檢查out/target/product/msm8610/system/fonts 有Xxx.ttf檔案,push到裝置,在裝置上檢視即可

致此,就將新增自定義.ttf字型檔檔案到系統的過程走完了。要注意的是,這些步驟僅僅只是將.ttf檔案編譯進了系統,至於怎麼使用,那就是另外一回事了

(二):由於新增到字型庫都顯示的英文,不知道他是什麼字型,下面我們可以改字型庫的名稱

如何修改字型在系統中顯示的名稱??

  Font Creator是一款優秀的國外軟體,主要功能是修改、製作字型庫。但由於製作中文字型檔工作量太大,所以通常情況下,個人很少用它來製作字型檔。該軟體目前有漢化版本推出,大家可以到網上自行搜尋。不少中文字型在系統中顯示的名稱是英文,有的朋友想把它顯示的名稱改成中文以方便查詢,此時Font Creator就可以派上用場了。下面以Windows XP作業系統、Font Creator 5.0英文版為例,簡要介紹下如何修改字型在系統中顯示的名稱。先以英文字型Kabel Medium BT為例。安裝並開啟Font Creator,單擊“File(檔案)—Open(開啟)—Installed Font(已安裝的字型)或者Font File(字型檔案),開啟需要修改的字型檔案。開啟字型檔案後,單擊“Format(格式)—Naming(命名),在Naming(命名)視窗中,字型的相關資訊,比如名稱、版本、版權等,便呈現在我們面前,此時即可以對這些資訊進行任何修改。修改字型在系統中顯示的名稱,只須修改“Include font family name(包括完整字型名稱)這一項,完成後單擊“OK”,然後儲存即可。關於Naming視窗中各項資訊與Windows系統的字型檢視器視窗中顯示的資訊之間的對應關係,見
圖:  
注意:改過後,重新替換frameworks\base\data\fonts下的字型庫,把改過名字的放進去,重現編譯:
在frameworks/base/data/fonts$ 單編,執行mm,然後push就OK了!


參考文章(一):http://blog.csdn.net/CrystalDestiny/article/details/50986888
參考文章(二):http://blog.csdn.net/wwwsq/article/details/8207762
參考文章(三):http://wenku.baidu.com/link?url=gPsk5zNHpejStHf3hjgwGKYlnwEOviA2UH4WvOfiVPv9BYAJlY7P9MYem0Z1VFrq1nmEISt6559XU-YVF1aAJXWrV_ZMGypw4sjaehswKRW


 


3,在Z:\myandroid\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java裡面新增
 

4,把之前改的都在原始碼裡面編譯,然後push到裝置,
驗證方法有2種:
(一),然裝置重置(這一步不能少),等重置完成,開機,檢視data\data\com.android.priovider.settings\date***\settings.db這個資料庫,你可以從裝置上pull下來用工具檢視,如果熟悉資料庫命令也可以直接使用命令檢視這個欄位
(二)進入shell,刪除data/tata/com.android.providers.settings/databases/settings.db 然後reboot,重啟後重新生成settings.db檢視即可


5,新增完後,在程式碼裡面使用,
獲取值的方法:Settings.System.getInt(getActivity().getContentResolver(), Settings.System.UPDATA_MODE,2);
設定值的方法,Settings.System.putInt