android监听电话状态问题

android 电话 service 手机

有时候我们开发软件的时候,需要拿到手机当前是否在通话状态,以做相应的处理。这时候就必然要去检测当前是否正在通话中。

先说说我们一般的做法:

1,在AndroidManifest.xml文件中,添加相应的权限和注册相应的广播接收。如下:

[html] view plain copy print ?
  1. <uses-permission android:name="android.permission.CALL_PHONE" />  
  2. <uses-permission android:name="android.permission.CALL_PRIVILEGED" />  
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  4. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />  
	
	
	
	
[html] view plain copy print ?
  1.   
  2.         <receiver android:name=".broadcast.PhoneStatReceiver">  
  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>  

		
			
				
				
			
		

2,然后我们写个广播接收类去接收系统消息并做相应处理。如下:

[java] view plain copy print ?
  1. @Override  
  2. public void onReceive(Context context, Intent intent) {  
  3.     if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {  
  4.         Log.e("hg""呼出……OUTING");  
  5.     }  
  6.     if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {  
  7.         TelephonyManager tm = (TelephonyManager) context  
  8.                 .getSystemService(Service.TELEPHONY_SERVICE);  
  9.         switch (tm.getCallState()) {  
  10.         case TelephonyManager.CALL_STATE_RINGING:  
  11.             Log.e("hg""电话状态……RINGING");  
  12.             break;  
  13.         case TelephonyManager.CALL_STATE_OFFHOOK:  
  14.             Log.e("hg""电话状态……OFFHOOK");  
  15.             break;  
  16.         case TelephonyManager.CALL_STATE_IDLE:  
  17.             Log.e("hg""电话状态……IDLE");  
  18.             break;  
  19.         }  
  20.     }  
  21. }  
	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
			Log.e("hg", "呼出……OUTING");
		}
		if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
			TelephonyManager tm = (TelephonyManager) context
					.getSystemService(Service.TELEPHONY_SERVICE);
			switch (tm.getCallState()) {
			case TelephonyManager.CALL_STATE_RINGING:
				Log.e("hg", "电话状态……RINGING");
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
				Log.e("hg", "电话状态……OFFHOOK");
				break;
			case TelephonyManager.CALL_STATE_IDLE:
				Log.e("hg", "电话状态……IDLE");
				break;
			}
		}
	}

3,将程序跑起来。看打印我们就能看到的调用顺序(当然了,我们也可以将上面的接收用两个类分开。这里我只是举个例子而已)

A:拨打15221XXXX好友,没接通前立马挂电话。State执行顺序:OFFHOOK---->IDLE

B:拨打15221XXXX好友,等着对方接通电话后。State执行顺序:OFFHOOK---->IDLE

C:好友打进来,自己不接,也不主动挂断。State执行顺序:RINGING---->IDLE
D:好友打进来,自己主动挂断或者好友主动挂断。State执行顺序:RINGING---->IDLE

E:好友打进来,我接。State执行顺序:RINGING---->OFFHOOK---->IDLE

你可能感兴趣的:(android监听电话状态问题)