android電話相關(guān)功能整合(讀取通話記錄、自動撥號漆枚、自動掛斷创译、自動接聽)

最近在做的一個crm項目要求實現(xiàn)實時上傳通話記錄和自動撥打電話功能,研究了一下電話相關(guān)的一系列功能墙基,趁著今天不忙在此總結(jié)下软族,做個備忘。

一残制、讀取通話記錄:

? ? ? ? 1立砸、首先android讀取通話記錄需要在清單文件添加相關(guān)權(quán)限<uses-permission android:name="android.permission.READ_CALL_LOG"/>

? ? ? ? 2、獲取通話記錄

Cursor:Cursor cursor= ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

getContentResolver().query(CallLog.Calls.CONTENT_URI,newString[{CallLog.Calls.DURATION,CallLog.Calls.TYPE,CallLog.

Calls.DATE,CallLog.Calls.NUMBER},null,null,CallLog.Calls.DEFAULT_SORT_ORDER);

? ? ? ? 3初茶、從每個cursor讀取對應每條通話記錄內(nèi)容:

while(cursor.moveToNext()) {

?type=cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));//1來電颗祝;2去電

?duration=cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DURATION));//時長

?date=cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE));//時間

?telnum=cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));//號碼

?}

? ? ? ? ? 4、拿到數(shù)據(jù)按需求做你想做的事恼布,就這么簡單

二螺戳、自動撥號:

? ? ? 1、添加權(quán)限 android.permission.CALL_PHONE

? ? ? 2折汞、調(diào)用打電話代碼一個intent即可實現(xiàn)

Uri uri=Uri.parse("tel:"+ phoneNum.trim());

Intent intent=newIntent(Intent.ACTION_CALL,uri);

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

mActivity.startActivityForResult(intent,520);

? ? ? ? 3倔幼、正常情況當你調(diào)用這幾行代碼的確可以播出電話,但是問題來啦字支,android手機對自動撥號是有權(quán)限詢問的凤藏,更有甚者用戶在系統(tǒng)設置禁 止了該權(quán)限奸忽。這兩種情況最終造成我們的功能體驗都不太好。所以解決思路就是引導用戶去系統(tǒng)設置給我們的應用自動撥號權(quán)限添加允 ? ? ? ? ? ? ? ? 許揖庄。這種情況就要求我們在撥號之前檢查是否有該權(quán)限栗菜,但是api23之前是沒有直接的方法可以調(diào)用查詢的至于23之后有沒有我沒有去確? ? ? ? ? ? ? ? 認,但是在我后來做手機通話狀態(tài)監(jiān)聽的時候我發(fā)現(xiàn)蹄梢,當有允許權(quán)限的時候startActivityForResult(intent,520)之后系統(tǒng)會發(fā)一個去電的廣 ? ? ? ? ? ? ?播android.intent.action.NEW_OUTGOING_CALL疙筹,而后會再調(diào)用mActivity的onActivityResult方法,如果權(quán)限被禁止或者處于詢問(小 ? ? ? ? ? ? ? 米)就會直接(或先)調(diào)用onActivityResult方法禁炒。這樣我們就可以在onActivityResult判斷是否開啟了允許權(quán)限而咆,若果沒有就可一彈框引導? ? ? ? ? ? ? 用戶去開起了。

三幕袱、自動掛斷:android掛斷電話的調(diào)用方法在ITelephony.java里而ITelephony.java是隱藏的暴备,我們不能直接調(diào)用endCall()方法所以我們要實現(xiàn)就緒做如下操作。

1们豌、由于ITelephony.java的包名是com.android.internal.telephony在自己項目src/main下創(chuàng)建aidl文件夾在該文件下創(chuàng)建包com.android.internal.telephony然后copy android源碼中的ITelephony.aidl文件到com.android.internal.telephony

2涯捻、由于ITelephony.aidl關(guān)聯(lián)了NeighboringCellInfo.aidl所以也一起copy過來包名android.telephony

3、兩個文件copy完之后clean一下望迎,你就會在你的gen目錄下發(fā)現(xiàn)已經(jīng)生成了ITelephony.java這個接口文件障癌,雖然生成了.java文件但是我們并不能直接調(diào)用,這是因為ITelephony對象是以一個系統(tǒng)服務的形式存在系統(tǒng)中的辩尊,所一要通過ServiceManager來拿到ITelephony對象涛浙,but? ServiceManager也是隱藏的。我們可以通過反射先拿到ServiceManager在通過ServiceManager.getService(String name)方法來取得ITelephony對象摄欲,而這個name就是當時addService()的時候使用的name(也就是phone)

Method method=null;

try{

method=Class.forName("android.os.ServiceManager").getMethod("getService",String.class);

IBinder binder= (IBinder)method.invoke(null,newObject[]{"phone"});

ITelephony telephony=ITelephony.Stub.asInterface(binder);

telephony.endCall();

}catch(NoSuchMethodExceptione) {

e.printStackTrace();

}catch(ClassNotFoundExceptione) {

e.printStackTrace();

}catch(InvocationTargetExceptione) {

e.printStackTrace();

}catch(IllegalAccessExceptione) {

e.printStackTrace();

}catch(RemoteExceptione) {

e.printStackTrace();

}

四轿亮、自動接聽

? ? ? ?1、由于自動接聽也是用到ITelephony所以基本準備工作與三相同

? ? ? 2胸墙、添加權(quán)限android.permission.CALL_PHONE和android.permission.MODIFY_PHONE_STATE

? ? ? 3哀托、廢話不再多說直接上代碼

Method method=null;

try{

method=Class.forName("android.os.ServiceManager").getMethod("getService",String.class);

IBinder binder= (IBinder)method.invoke(null,newObject[]{"phone"});

ITelephony telephony=ITelephony.Stub.asInterface(binder);

telephony.answerRingingCall();

}catch(NoSuchMethodExceptione) {

e.printStackTrace();

}catch(ClassNotFoundExceptione) {

e.printStackTrace();

}catch(InvocationTargetExceptione) {

e.printStackTrace();

}catch(IllegalAccessExceptione) {

e.printStackTrace();

}catch(RemoteExceptione) {

e.printStackTrace();

}

4、但是answerRingingCall()在4.1之后增加了權(quán)限檢查(自動掛斷電話沒有)劳秋,這個時候再調(diào)用上面的方法會catch到一個Exception仓手,我們可以在catch里走另外一套自動接聽的方法,可以看一下packages/apps/Phone/src/com/android/phone/PhoneGlobals.java的源碼玻淑,你會發(fā)現(xiàn)里面注冊一個廣播接收器MediaButtonBroadcastReceiver嗽冒,action就是“android.intent.action.MEDIA_BUTTON”并且在receiver方法里做了answerCall(phone.getRingingCall());接聽電話的操作,所以我們在catch里只需發(fā)一個相應的廣播就可以啦补履,是的你沒看錯就是發(fā)一個廣播就可以啦就是這么逗添坊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箫锤,隨后出現(xiàn)的幾起案子贬蛙,更是在濱河造成了極大的恐慌雨女,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳准,死亡現(xiàn)場離奇詭異氛堕,居然都是意外死亡,警方通過查閱死者的電腦和手機野蝇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門讼稚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绕沈,你說我怎么就攤上這事锐想。” “怎么了乍狐?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵赠摇,是天一觀的道長。 經(jīng)常有香客問我浅蚪,道長蝉稳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任掘鄙,我火速辦了婚禮,結(jié)果婚禮上嗡髓,老公的妹妹穿的比我還像新娘操漠。我一直安慰自己,他們只是感情好饿这,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布浊伙。 她就那樣靜靜地躺著,像睡著了一般长捧。 火紅的嫁衣襯著肌膚如雪嚣鄙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天串结,我揣著相機與錄音哑子,去河邊找鬼。 笑死肌割,一個胖子當著我的面吹牛卧蜓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播把敞,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼弥奸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奋早?” 一聲冷哼從身側(cè)響起盛霎,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赠橙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后愤炸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體期揪,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年摇幻,在試婚紗的時候發(fā)現(xiàn)自己被綠了横侦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡绰姻,死狀恐怖枉侧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狂芋,我是刑警寧澤榨馁,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站帜矾,受9級特大地震影響翼虫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屡萤,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一珍剑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧死陆,春花似錦招拙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至领虹,卻和暖如春规哪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塌衰。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工诉稍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人最疆。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓均唉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肚菠。 傳聞我的和親對象是個殘疾皇子舔箭,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容