需要許可權:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
方式一:通過廣播接收來電
定義來電廣播接收類
package com.zhouzijing.android.demo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.telephony.TelephonyManager;import android.util.Log;public class BroadcastReceiverMgr extends BroadcastReceiver { private final String TAG = MyBroadcastReceiver.TAG; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.i(TAG, "[Broadcast]"+action); //呼入電話 if(action.equals(MyBroadcastReceiver.B_PHONE_STATE)){ Log.i(TAG, "[Broadcast]PHONE_STATE"); doReceivePhone(context,intent); } } /** * 處理電話廣播. * @param context * @param intent */ public void doReceivePhone(Context context, Intent intent) { String phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); int state = telephony.getCallState(); switch(state){ case TelephonyManager.CALL_STATE_RINGING: Log.i(TAG, "[Broadcast]等待接電話="+phoneNumber); break; case TelephonyManager.CALL_STATE_IDLE: Log.i(TAG, "[Broadcast]電話掛斷="+phoneNumber); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.i(TAG, "[Broadcast]通話中="+phoneNumber); break; } }}
package com.zhouzijing.android.demo;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;import android.view.View;public class MyBroadcastReceiver extends Activity { public final static String TAG = "MyBroadcastReceiver"; public final static String B_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED; private BroadcastReceiverMgr mBroadcastReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_broadcast_receiver); } //按鈕1-註冊廣播 public void registerIt(View v) { Log.i(TAG, "registerIt"); mBroadcastReceiver = new BroadcastReceiverMgr(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(B_PHONE_STATE); intentFilter.setPriority(Integer.MAX_VALUE); registerReceiver(mBroadcastReceiver, intentFilter); } //按鈕2-撤銷廣播 public void unregisterIt(View v) { Log.i(TAG, "unregisterIt"); unregisterReceiver(mBroadcastReceiver); } }
方式二:通過監聽器來實現
package com.zhouzijing.android.demo;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;import android.view.View;public class MyBroadcastReceiver extends Activity { public final static String TAG = "MyBroadcastReceiver"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_broadcast_receiver); } /** * 按鈕-監聽電話 * @param v */ public void createPhoneListener(View v) { TelephonyManager telephony = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); telephony.listen(new OnePhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE); } /** * 電話狀態監聽. * @author stephen * */ class OnePhoneStateListener extends PhoneStateListener{ @Override public void onCallStateChanged(int state, String incomingNumber) { Log.i(TAG, "[Listener]電話號碼:"+incomingNumber); switch(state){ case TelephonyManager.CALL_STATE_RINGING: Log.i(TAG, "[Listener]等待接電話:"+incomingNumber); break; case TelephonyManager.CALL_STATE_IDLE: Log.i(TAG, "[Listener]電話掛斷:"+incomingNumber); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.i(TAG, "[Listener]通話中:"+incomingNumber); break; } super.onCallStateChanged(state, incomingNumber); } } }