首先,網上學習到的來電監聽有兩種方法,但在雙卡手機上都不太正常工做。 java
通過用戶的反饋,基本上都能監聽到大部分主流雙卡手機的主副卡來電了。若是同時使用兩種監聽辦法,大部分機器上都會出現監聽到兩次,這時候須要作些防重複的處理。這裏就不細說,若是你有什麼防重複有什麼好看法能夠留言。 android
由於沒有雙卡手機用來測試,因此只能根據用戶的反饋來推測緣由了。是否是要兼容就得把兩個方法都使用上呢? app
第一種方法,據用戶說三星的雙卡手機(主卡與副卡)是能夠的,HTC的就沒有反應了。 ide
import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; import android.util.Log; /** * 電話狀態的監聽廣播 * @author Lijy91 * @created 2013.3.31 */ public class IncomingCallReceiver extends BroadcastReceiver { // Tag private String Tag = this.getClass().getSimpleName(); private static String call_number = null; @Override public void onReceive(Context ctx, Intent intent) { // 去電 if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); Log.d(Tag, String.format("call Out : %s", phoneNumber)); // 來電 } else { TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Service.TELEPHONY_SERVICE); switch (tm.getCallState()) { // 響鈴中 case TelephonyManager.CALL_STATE_RINGING: call_number = intent.getStringExtra("incoming_number"); Log.d(Tag, String.format("call Ringing : %s", call_number)); break; // 已接通 case TelephonyManager.CALL_STATE_OFFHOOK: Log.d(Tag, String.format("call Offhook : %s", call_number)); break; // 掛斷 case TelephonyManager.CALL_STATE_IDLE: Log.d(Tag, "call Idle"); break; } } } }
第二種方法經試驗,支持單卡和某款HTC的雙卡手機,三星NOTE2沒法監聽(主卡正常,副卡沒法監聽) 學習
import android.content.Context; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; /** * @author lijy91 * */ public class PbPhoneStateListener extends PhoneStateListener { // Tag private String Tag = this.getClass().getSimpleName(); public PbPhoneStateListener(Context context) { this.mContext = context; } @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { // 響鈴中 case TelephonyManager.CALL_STATE_RINGING: { Log.d(Tag, String.format("call Ringing : %s", incomingNumber)); break; } // 已接通 case TelephonyManager.CALL_STATE_OFFHOOK: { Log.d(Tag, String.format("call Offhook : %s", incomingNumber)); break; } // 掛斷 case TelephonyManager.CALL_STATE_IDLE: { Log.d(Tag, "call Idle"); break; } } } }