Android 获取SIM卡信息及状态的监听

获取的数据流量使用TrafficStats 类:
总接受流量TrafficStats.getTotalRxBytes();
总发送流量TrafficStats.getTotalTxBytes());
了解更多点击查看参考文章
但是获取到的流量是双卡的总和,双卡情况下如何统计单张SIM卡的数据流量呢?
1可以根据ISMI号来区分SIM卡,每个sim卡有唯一的ISMI号。
2SIM之间切换通过广播事件可以监听得到。

1、什么是imsi号

国际移动用户识别码(IMSI:International Mobile SubscriberIdentification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,使用0~9的数字。其中MCC(mobile country code)是移动用户所属国家代号,占3位数字,中国的MCC规定为460;MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网;MSIN是移动用户识别码,用以识别某一移动通信网中的移动用户。
MNC:Mobile Network Code,移动网络码,2~3位,中国移动系统使用00、02、07,中国联通GSM系统使用01,中国电信CDMA系统使用03,一个典型的IMSI号码为460030912121001;

2、SIM卡信息获取

移动4G卡为例

Android 获取SIM卡信息及状态的监听_第1张图片
SIM卡信息
/**
*TelephonyManager源码
*/
public class TelephonyManager
/** @hide */
public TelephonyManager(Context context) 
/** @hide */
private TelephonyManager()
private static TelephonyManager sInstance = new TelephonyManager();
/** @hide
/* @deprecated - use getSystemService as described above */
public static TelephonyManager getDefault() {    
      return sInstance;
}
/**
*返回1单卡
*返回2双卡
*该接口Android 6.0才有的
*/
public int getPhoneCount()
/**
* @see #PHONE_TYPE_NONE ()
* @see #PHONE_TYPE_GSM (1)
* @see #PHONE_TYPE_CDMA ()
* @see #PHONE_TYPE_SIP ()
*/
public int getPhoneType()

/** 
  *Phone radio is GSM.
  */
public static final int PHONE_TYPE_GSM = PhoneConstants.PHONE_TYPE_GSM;
/** 
  *Phone radio is CDMA. 
  */
public static final int PHONE_TYPE_CDMA = PhoneConstants.PHONE_TYPE_CDMA;
/** 
  *Phone is via SIP.
  */
public static final int PHONE_TYPE_SIP = PhoneConstants.PHONE_TYPE_SIP;
/**
  *SIM卡的序列号,不可用返回null
  */
public String getSimSerialNumber()
/**
  *获取imsi
  */
public String getSubscriberId()
/**
  *返回网络运营 MCC + MNC
  */
public String getNetworkOperator()
/**
  *返回SIM卡 MCC+MNC
  */
public String getSimOperator()
/**
  *获取IMEI,设备唯一ID
  */
public String getDeviceId()

获取设备ID,即IMEI详情点击查看

3、SIM卡之间切换事件的监听

package com.example.demorxbytes;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

/**
 * 
 监听sim状态改变的广播,返回sim卡的状态, 有效或者无效。 双卡中只要有一张卡的状态有效即返回状态为有效,两张卡都无效则返回无效。
 * 
 * @author 
 * 
 */
public class SimStateReceive extends BroadcastReceiver {
    private final static String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
    private final static int SIM_VALID = 0;
    private final static int SIM_INVALID = 1;
    private int simState = SIM_INVALID;

    public int getSimState() {
        return simState;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ACTION_SIM_STATE_CHANGED)) {
            TelephonyManager tm = (TelephonyManager) context
                    .getSystemService(Service.TELEPHONY_SERVICE);
            int state = tm.getSimState();

            switch (state) {
            case TelephonyManager.SIM_STATE_READY:
                Toast.makeText(context,
                        "state:" + state + " Imsi " + getImsi(context),
                        Toast.LENGTH_LONG).show();
                simState = SIM_VALID;
                break;
            case TelephonyManager.SIM_STATE_UNKNOWN:
            case TelephonyManager.SIM_STATE_ABSENT:
            case TelephonyManager.SIM_STATE_PIN_REQUIRED:
            case TelephonyManager.SIM_STATE_PUK_REQUIRED:
            case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
            default:
                simState = SIM_INVALID;
                break;
            }
        }
    }

    public static String getImsi(Context context) {
        TelephonyManager tm = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        String deviceid = tm.getDeviceId();// 获取智能设备唯一编号
        String te1 = tm.getLine1Number();// 获取本机号码
        String simei = tm.getSimSerialNumber();// 获得SIM卡的序号
        String imsi = tm.getSubscriberId();// 得到用户Id
        if (imsi != null && !imsi.equals("")) {
            Log.i("test", "获取手机信息====Deviceid" + deviceid + "teleNum" + te1
                    + "SimNUM" + imei + "UserId" + imsi);
            return imsi;
        }
        return "未知";
    }

}

参考文章一
参考文章二

你可能感兴趣的:(Android 获取SIM卡信息及状态的监听)