获取的数据流量使用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卡为例
/**
*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 "未知";
}
}