android 電話狀態監聽(來電和去電)實現代碼

從事android開發的朋友們可能電話狀態監聽不是很擅長,接下來將詳細介紹電話狀態監聽功能的實現步驟,須要瞭解的朋友能夠參考下。android

實現手機電話狀態的監聽,主要依靠兩個類:TelephoneManger和PhoneStateListener。 
TelephonseManger提供了取得手機基本服務的信息的一種方式。所以應用程序可使用TelephonyManager來探測手機基本服務的狀況。應用程序能夠註冊listener來監聽電話狀態的改變。咱們不能對TelephonyManager進行實例化,只能經過獲取服務的形式: 
Context.getSystemService(Context.TELEPHONY_SERVICE); 
注意:對手機的某些信息進行讀取是須要必定許可(permission)的。 
主要靜態成員常量:(它們對應PhoneStateListener.LISTEN_CALL_STATE所監聽到的內容) 
int CALL_STATE_IDLE 空閒狀態,沒有任何活動。 
int CALL_STATE_OFFHOOK 摘機狀態,至少有個電話活動。該活動或是撥打(dialing)或是通話,或是 on hold。而且沒有電話是ringing or waiting 
int CALL_STATE_RINGING 來電狀態,電話鈴聲響起的那段時間或正在通話又來新電,新來電話不得不等待的那段時間。 
手機通話狀態在廣播中的對應值 
EXTRA_STATE_IDLE 它在手機通話狀態改變的廣播中,用於表示CALL_STATE_IDLE狀態 
EXTRA_STATE_OFFHOOK 它在手機通話狀態改變的廣播中,用於表示CALL_STATE_OFFHOOK狀態 
EXTRA_STATE_RINGING 它在手機通話狀態改變的廣播中,用於表示CALL_STATE_RINGING狀態 
ACTION_PHONE_STATE_CHANGED 在廣播中用ACTION_PHONE_STATE_CHANGED這個Action來標示通話狀態改變的廣播(intent)。 
注:須要許可READ_PHONE_STATE。 
String EXTRA_INCOMING_NUMBER 
在手機通話狀態改變的廣播,用於從extra取來電號碼。 
String EXTRA_STATE 在通話狀態改變的廣播,用於從extra取來通話狀態。 

主要成員函數 
public int getCallState() 取得手機的通話狀態。 
public CellLocation getCellLocation () 返回手機當前所處的位置。若是當前定位服務不可用,則返回null 
注:須要許可(Permission)ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. 
public int getDataActivity () 返回當前數據鏈接活動狀態的狀況。 
public int getDataState () 返回當前數據鏈接狀態的狀況。 
public String getDeviceId () 
返回手機的設備ID。好比對於GSM的手機來講是IMEI碼,對於CDMA的手機來講MEID碼或ESN碼。若是讀取失敗,則返回null。 

如何實現電話狀態的監聽呢? 
Android在電話狀態改變是會發送action爲android.intent.action.PHONE_STATE的廣播,而撥打電話時會發送action爲android.intent.action.NEW_OUTGOING_CALL的廣播,可是我看了下開發文檔,暫時沒發現有來電時的廣播。經過自定義廣播接收器,接受上述兩個廣播即可。 app

 

 
  1.  
  2. package com.pocketdigi.phonelistener; ide

  3. import android.app.Service; 函數

  4. import android.content.BroadcastReceiver; this

  5. import android.content.Context; .net

  6. import android.content.Intent; code

  7. import android.telephony.PhoneStateListener; xml

  8. import android.telephony.TelephonyManager; 對象

  9. public class PhoneReceiver extends BroadcastReceiver { 事件

  10. @Override

  11. public void onReceive(Context context, Intent intent) {

  12. System.out.println("action"+intent.getAction());

  13. //若是是去電

  14. if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){

  15. String phoneNumber = intent

  16. .getStringExtra(Intent.EXTRA_PHONE_NUMBER);

  17. Log.d(TAG, "call OUT:" + phoneNumber);

  18. }else{

  19. //查了下android文檔,貌似沒有專門用於接收來電的action,因此,非去電即來電.

  20. //若是咱們想要監聽電話的撥打情況,須要這麼幾步 :

  21. * 第一:獲取電話服務管理器TelephonyManager manager = this.getSystemService(TELEPHONY_SERVICE);

  22. * 第二:經過TelephonyManager註冊咱們要監聽的電話狀態改變事件。manager.listen(new MyPhoneStateListener(),

  23. * PhoneStateListener.LISTEN_CALL_STATE);這裏的PhoneStateListener.LISTEN_CALL_STATE就是咱們想要

  24. * 監聽的狀態改變事件,初次以外,還有不少其餘事件哦。

  25. * 第三步:經過extends PhoneStateListener來定製本身的規則。將其對象傳遞給第二步做爲參數。

  26. * 第四步:這一步很重要,那就是給應用添加權限。android.permission.READ_PHONE_STATE

  27. TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);

  28. tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

  29. //設置一個監聽器

  30. }

  31. }

  32. PhoneStateListener listener=new PhoneStateListener(){

  33. @Override

  34. public void onCallStateChanged(int state, String incomingNumber) {

  35. //注意,方法必須寫在super方法後面,不然incomingNumber沒法獲取到值。

  36. super.onCallStateChanged(state, incomingNumber);

  37. switch(state){

  38. case TelephonyManager.CALL_STATE_IDLE:

  39. System.out.println("掛斷");

  40. break;

  41. case TelephonyManager.CALL_STATE_OFFHOOK:

  42. System.out.println("接聽");

  43. break;

  44. case TelephonyManager.CALL_STATE_RINGING:

  45. System.out.println("響鈴:來電號碼"+incomingNumber);

  46. //輸出來電號碼

  47. break;

  48. }

  49. }

  50. };

  51. }

要在AndroidManifest.xml註冊廣播接收器:

 

 
  1.  
  2. <receiver android:name=".PhoneReceiver">

  3. <intent-filter>

  4. <action android:name="android.intent.action.PHONE_STATE"/>

  5. <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

  6. </intent-filter>

  7. </receiver>

  8. <receiver android:name=".PhoneReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE"/> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>


還要添加權限:

 

 
  1.  
  2. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

  3. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>

相關文章
相關標籤/搜索