天天看點

android 之電話監聽

在android中,要監聽來電與去電是比較簡單的,至少有如下兩種方法。

1. Receiver

定義一個Receiver派生類,并指定action:android.intent.action.PHONE_STATE即可, 直接上代碼。

public class PhoneStateReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String phoneNumber = intent
		.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
		
		if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
			Toast.makeText(context, "Receiver" + phoneNumber + " 去電",
					Toast.LENGTH_SHORT).show();
		} else {
			TelephonyManager tm = (TelephonyManager) context
					.getSystemService(Context.TELEPHONY_SERVICE);
			
			switch (tm.getCallState()) {
			case TelephonyManager.CALL_STATE_RINGING:
				Toast.makeText(context, "Receiver" + phoneNumber + " 來電",
						Toast.LENGTH_SHORT).show();
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
				Toast.makeText(context, "Receiver 正在通話",
						Toast.LENGTH_SHORT).show();
				break;
			default:
				break;
			}
		}
	}
}
           

Note:去電需要在manifest檔案中加上action: android.intent.action.NEW_OUTGOING_CALL

2.利用系統服務TelephonyManager。

利用TelephonyManager::listen注冊一個listeners來監聽電話狀态,listen原型如下,

void listen (PhoneStateListener listener, int events) 

其中events可設為:PhoneStateListener.LISTEN_CALL_STATE。

完整代碼如下:

public class PhoneStateMonitorActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

		tm.listen(new MyPhoneStateListener(),
				PhoneStateListener.LISTEN_CALL_STATE);
	}

	class MyPhoneStateListener extends PhoneStateListener {

		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_RINGING:
				Toast.makeText(PhoneStateMonitorActivity.this,
						incomingNumber + " 來電", Toast.LENGTH_SHORT).show();
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
				Toast.makeText(PhoneStateMonitorActivity.this, "正在通話",
						Toast.LENGTH_SHORT).show();
				break;
			default:
				break;
			}

			super.onCallStateChanged(state, incomingNumber);
		}
	}
}
           

在模拟器測試該代碼,可以通過DDMS Emulator Control模拟電話撥入。

注意:兩種方法都需要加上READ_PHONE_STATE 權限。

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