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

首先,网上学习到的来电监听有两种方法,但在双卡手机上都不太正常工做。 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;
            }
        }
    }
}
相关文章
相关标签/搜索