在Android中,電話跟簡訊一樣,也是有一套訊息(廣播)機制的,我們只需要註冊一個Receiver,接收Android電話的相關廣播就OK了,下面這段代碼是一個完整的BroadcasReceiver類,能夠監聽Android系統下打進來的電話和打出去的電話:
package com.contact.main.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.util.Log;
public class IncommingCallLogReceiver extends BroadcastReceiver {
private final String TAG = IncommingCallLogReceiver.class.getSimpleName();
public static final String ACTION_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;
private Context mContext;
@Override
public IBinder peekService(final Context myContext, final Intent service) {
return super.peekService(myContext, service);
}
@Override
public void onReceive(Context context, Intent intent) {
mContext = context;
final String action = intent.getAction();
final String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
Log.e(TAG, "Call State Changed, Action = " + action);
if (ACTION_PHONE_STATE.equals(action)) {// 通話狀態改變
Log.e(TAG, "電話狀態改變");
if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {// 電話響鈴RINGING
final String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.e(TAG, "Number:" + number);
Log.e(TAG, "電話響鈴中…");
} else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {// 接電話OFFHOOK
Log.e(TAG, "接聽");
} else if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {// 掛電話IDLE
Log.e(TAG, "掛斷");
}
} else if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) {// 攔截呼出電話
final String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.e(TAG, "電話呼出,呼出號碼為:" + phoneNumber);
}
}
}
當然,要想這個Receiver工作起來,還必須在AndroidManifest.xml中進行註冊:
<receiver android:name="com.contact.main.receiver.IncommingCallLogReceiver" >
<intent-filter android:priority="10000" >
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
這樣做了還不夠,因為我們還缺少相應的操作許可權:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
</uses-permission>
<uses-permission android:name="android.permission.VIBRATE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.GET_TASKS" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.READ_CONTACTS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.SEND_SMS" >
</uses-permission>
上面的許可權比較全了,包括操作Android系統連絡人,簡訊和通話記錄的所有許可權。
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
</uses-permission>
這個許可權比較關鍵,缺少它的話,我們是監聽不到本機打出去的電話的,或者說能夠監聽得到,但無法分辨是打出去的還是打進來的,加上這個許可權後,我們就能夠監聽到:Intent.ACTION_NEW_OUTGOING_CALL這個廣播了:
public static final String ACTION_NEW_OUTGOING_CALL =
"android.intent.action.NEW_OUTGOING_CALL";
原文地址 http://www.cppcode.com/archives/2012/04/01/259.html