[已驗證]雙卡手機下兩種來電監聽方法的一些問題。

首先,網上學習到的來電監聽有兩種方法,但在雙卡手機上都不太正常工做。 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;
            }
        }
    }
}
相關文章
相關標籤/搜索