双SIM卡,Android监听SIM卡状态

最近在搞一个项目,其中有一块关于双SIM卡状态监听,在这一块上没有经验,在网上找了很多例子,但都是只是监听SIM卡改变状态,而我要的是不但要监听SIM状态改变,而且还要知道具体是哪张SIM卡状态改变,度娘找寻好久后,还是没有结果,于是便自行来研究下。

首先,SIM卡状态改变的action是android.intent.action.SIM_STATE_CHANGED,需要在Manifest.xml进行注册。

当receiver收到这个action广播时:

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    final String action = intent.getAction();
    Log.i(TAG,"++++++Action:"+action);
    if("android.intent.action.SIM_STATE_CHANGED".equals(action)){
        Log.d(TAG,"###############start");
        setSimInfoByChange(context,intent);
    }
}
private void setSimInfoByChange(Context context,Intent intent){
    //subid 卡ID
    int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
    //soltId 卡槽ID 0:卡槽一  1:卡槽二
    int soltId = intent.getIntExtra("slot",SOLTID);
    Log.d(TAG, " #######subId:"+subId);
    Bundle mBundle = intent.getExtras();//从中可以看到intent的发送过来的数据

    Log.d(TAG, " #######mBundle:"+mBundle.toString());
    String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
    if (stateExtra!=null) {
        if (stateExtra.equals("ABSENT")) { //卡拔出状态
            SIM_STATE = 1;
            SimInfo = context.getString(R.string.cell_broadcast_widget_no_sim_card, "No SIM Cards");
        } else if (stateExtra.equals("READY") ||  //卡正常状态  即可以读出卡信息
                stateExtra.equals("IMSI") ||
                stateExtra.equals("LOADED") ){
            SIM_STATE = 0;
        }else if(stateExtra.equals("LOCKED") || //卡被锁状态 
                stateExtra.equals("NOT_READY") ||
                stateExtra.equals("PIN")||
                stateExtra.equals("PUK")){
            SIM_STATE = 2;
            SimInfo = context.getString(R.string.cell_broadcast_widget_no_service,"No Services");
        }
    }
    Log.d(TAG, " #######stateExtra:"+stateExtra+"+++++SimInfo:"+SimInfo);
    Log.d(TAG, " #######soltId:"+soltId);
}
通过这个intent可以找到相应的SIM及卡槽信息,同时
String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
这个方法可以获取SIM卡改变的状态情况,在icccardconstants的API中可以发现有这些状态:

通过这个方法就可以将卡槽与广播进行相对应起来,这样就能区做我们想要做的事情了。刚开始写博客,写的有点乱,勿怪勿怪!

监听 Android 设备的 SIM 卡状态,可以使用 `PhoneStateListener` 类。以下是一个示例代码: ```java import android.content.Context; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class SimStateReceiver { private static final String TAG = "SimStateReceiver"; private Context mContext; private TelephonyManager mTelephonyManager; private PhoneStateListener mPhoneStateListener; public SimStateReceiver(Context context) { mContext = context; mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mPhoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String phoneNumber) { super.onCallStateChanged(state, phoneNumber); Log.d(TAG, "onCallStateChanged: state = " + state + ", phoneNumber = " + phoneNumber); } @Override public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); Log.d(TAG, "onServiceStateChanged: serviceState = " + serviceState); } @Override public void onSimStateChanged(int state) { super.onSimStateChanged(state); Log.d(TAG, "onSimStateChanged: state = " + state); switch (state) { case TelephonyManager.SIM_STATE_ABSENT: // SIM 卡不存在或未插入 break; case TelephonyManager.SIM_STATE_NETWORK_LOCKED: // SIM 卡已被网络锁定 break; case TelephonyManager.SIM_STATE_PIN_REQUIRED: // SIM 卡需要 PIN 解锁 break; case TelephonyManager.SIM_STATE_PUK_REQUIRED: // SIM 卡需要 PUK 解锁 break; case TelephonyManager.SIM_STATE_READY: // SIM 卡已准备好 break; case TelephonyManager.SIM_STATE_UNKNOWN: // SIM 卡状态未知 break; } } }; } public void start() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIM_STATE); } public void stop() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } } ``` 在上面的代码中,我们创建了一个 `SimStateReceiver` 类,它有一个 `start()` 方法和一个 `stop()` 方法,用于开始和停止监听 SIM 卡状态。在 `SimStateReceiver` 的构造方法中,我们创建了一个 `PhoneStateListener` 对象,并重写了其中的 `onSimStateChanged()` 方法,用于监听 SIM 卡状态的变化。在 `onSimStateChanged()` 方法中,我们根据不同的 SIM 卡状态打印不同的日志信息。最后,在 `start()` 方法中,我们通过 `TelephonyManager` 的 `listen()` 方法注册了 `PhoneStateListener` 对象,开始监听 SIM 卡状态。在 `stop()` 方法中,我们通过 `TelephonyManager` 的 `listen()` 方法取消了 `PhoneStateListener` 对象的注册,停止监听 SIM 卡状态
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值