[已验证]双卡手机下两种来电监听方法的一些问题。

首先,网上学习到的来电监听有两种方法,但在双卡手机上都不太正常工作。

经过用户的反馈,基本上都能监听到大部分主流双卡手机的主副卡来电了。如果同时使用两种监听办法,大部分机器上都会出现监听到两次,这时候需要做些防重复的处理。这里就不细说,如果你有什么防重复有什么好见解可以留言。

因为没有双卡手机用来测试,所以只能根据用户的反馈来推测原因了。是不是要兼容就得把两个方法都使用上呢?

第一种方法,据用户说三星的双卡手机(主卡与副卡)是可以的,HTC的就没有反应了。

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;
            }
        }
    }
}

你可能感兴趣的:(监听,电话,来电,来电监听)