構(gòu)建Android電話相關(guān)的應(yīng)用
上次介紹了一下Android的RIL架構(gòu),我們可以把它理解為是GSM模塊的驅(qū)動(dòng),這次要介紹的是Telephony這個(gè)組件,我們把它和WinCE做對(duì)比,發(fā)現(xiàn)它其實(shí)就是做了CellCore做的工作,只是CellCore依然很面向過(guò)程地單純導(dǎo)出SDK,然后讓上層驅(qū)動(dòng)調(diào)用。Telephony由于是運(yùn)行在我們的Dalvik虛擬機(jī)上面的,所以它的實(shí)現(xiàn)也就更面向?qū)ο蠡恕=酉聛?lái)讓我們看看怎么使用這個(gè)Telephony庫(kù)開發(fā)我們的電話應(yīng)用。
Telephony庫(kù)主要負(fù)責(zé)Android的撥打與接聽電話功能,其中有兩個(gè)重要的類分別是IPhone和PhoneNumberUtils是我們實(shí)現(xiàn)電話功能必不可少的。當(dāng)我們的應(yīng)用需要撥打一個(gè)號(hào)碼的時(shí)候,Android默認(rèn)是沒(méi)有授予我們這個(gè)應(yīng)用的這個(gè)權(quán)限的,因此我們必須在AndroidManifest.xml中去打開這個(gè)權(quán)限。AndroidManifest.xml是每一個(gè)應(yīng)用都需要的文件,它位于應(yīng)用的根目錄下,文件里描述了程序包的全局變量,包括暴露的應(yīng)用組件(activities, services等等)和為每個(gè)組件的實(shí)現(xiàn)類,以及什么樣的數(shù)據(jù)可以操作和它在什么地方運(yùn)行?,F(xiàn)在我們?cè)?lt;manifest>里面添加一行:
從此我們的應(yīng)用就擁有了撥打電話的權(quán)限了,接下來(lái)就是建立一個(gè)IPhone類的對(duì)象,上次我已經(jīng)介紹了必須要通過(guò)ServiceManager來(lái)獲得,以下代碼演示了如何建立一個(gè)IPhone類對(duì)象:
{
IServiceManager sm = ServiceManagerNative.getDefault();
IPhone phoneService = IPhone.Stub.asInterface(sm.getService("phone"));
return phoneService;
}
一旦建立完了IPhone對(duì)象,即可使用call或者dail方法來(lái)?yè)茈娫捔?
void dial(String number)
它們之間的差別就是call是在后臺(tái)進(jìn)行的,一般用于數(shù)據(jù)傳輸(gprs,edge)的應(yīng)用,而dial是會(huì)顯示一個(gè)簡(jiǎn)單的撥號(hào)界面,上面預(yù)設(shè)了你的參數(shù)作為撥號(hào)的號(hào)碼,如果給dial的參數(shù)傳入NULL,則會(huì)調(diào)用撥號(hào)的界面顯示出來(lái)。
還有一種簡(jiǎn)單的撥號(hào)方法,有仔細(xì)看Intent文檔的人就會(huì)發(fā)現(xiàn),對(duì)一個(gè)電話格式的網(wǎng)址(如href="tel+86)1234567890")發(fā)送出CALL_ACTION,就可以調(diào)用撥號(hào)程序?qū)ζ溥M(jìn)行撥號(hào)。這種方便的方法可以在開發(fā)我們的瀏覽器應(yīng)用的時(shí)候,直接在瀏覽網(wǎng)頁(yè)的時(shí)候正則匹配到電話號(hào)碼,然后直接調(diào)用撥號(hào)程序?qū)ζ鋼芴?hào),很方便吧。
獲取電話的屬性可以通過(guò)TelephonyProperties來(lái)實(shí)現(xiàn),比如SIM卡,IMEI等信息,我們可以通過(guò)調(diào)用os.SystemProperties.put()方法傳入TelephonyProperties的字段來(lái)設(shè)置對(duì)應(yīng)的參數(shù),也可以通過(guò)os.SystemProperties.get()方法獲取這些參數(shù),以下是一些實(shí)際引用的例子:
獲取本機(jī)號(hào)碼,調(diào)用android.os.SystemProperties.get(PROPERTY_LINE1_NUMBER);
獲取IMEI,調(diào)用android.os.SystemProperties.get(PROPERTY_IMEI);
獲取運(yùn)營(yíng)商名字,調(diào)用android.os.SystemProperties.get(PROPERTY_SIM_OPERATOR_ALPHA);
獲取國(guó)家代碼,調(diào)用android.os.SystemProperties.get(PROPERTY_SIM_OPERATOR_ISO_COUNTRY);
獲取語(yǔ)音信箱號(hào)碼,調(diào)用哪個(gè)android.os.SystemProperties.get(PROPERTY_LINE1_VOICE_MAIL_NUMBER);
【編輯推薦】























