Android开发——反射获取双卡Sim卡信息

参考了前辈的博客:https://blog.csdn.net/ymcl_hx/article/details/53484797

直接封装出来一个工具类,记录一下

package com.dreamroom.device;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;

import android.telephony.TelephonyManager;

public class SimUtils {

	public JSONArray getAllSimInfo(TelephonyManager tel) throws Exception {
		Class clazz = tel.getClass();
		
		//获取可以进行反射的字段
		List list = new ArrayList<>();
		Map listIgnore = new HashMap<>();

		Method[] methods = clazz.getDeclaredMethods();
		for(Method method : methods) {
			String name = method.getName();
			if(!name.startsWith("get"))
				continue;
			
			if(listIgnore.get(name) != null)
				continue;
			listIgnore.put(name, 0);

			Method m1 = null;
			Method m2 = null;
			Method m3 = null;
			try {m1 = clazz.getDeclaredMethod(name); } catch(Exception e) {}
			try {m2 = clazz.getDeclaredMethod(name, int.class); } catch(Exception e) {}
			try {m3 = clazz.getDeclaredMethod(name, long.class); } catch(Exception e) {}
			
			if(m1 != null && ((m2 == null && m3 != null) || (m2 != null && m3 == null))) {
				Class c1 = m1.getReturnType();
				Class c2 = m2 == null ? null : m2.getReturnType();
				Class c3 = m3 == null ? null : m3.getReturnType();
				if(m2 == null) {
					if(c1 == null || c1 != c3)
						continue;
				} else {
					if(c1 == null || c1 != c2)
						continue;
				}
				EMethod item = new EMethod(name, m2 == null ? 1 : 0, c1);
				list.add(item);
			}
		}
		listIgnore.clear();
		
		JSONArray array = new JSONArray();
		for(int i=0; i<10; i++) {
			JSONObject json = new JSONObject();
			for(EMethod em : list) {
				Method method = null;
				Object param = null;
				if(em.type == 0) {
					method = clazz.getDeclaredMethod(em.name, int.class);
					param = i;
				} else {
					method = clazz.getDeclaredMethod(em.name, long.class);
					param = new Long(i);
				}
				if(!method.isAccessible())
					method.setAccessible(true);
				
				String name = em.name.substring(3);
				Object value = null;
				try {
					value = method.invoke(tel, param);
				} catch(Exception e) {
					//前面已经对private设置了可访问,有些还是会报错,就不管这个了
					continue;
				}
				
				json.put(name, value);
			}
			
			if(json.optInt("SimState") == TelephonyManager.SIM_STATE_UNKNOWN || json.optInt("SimState") == TelephonyManager.SIM_STATE_ABSENT)
				continue;
			
			String imsi = json.optString("SubscriberId");
			if(imsi == null || imsi.length() == 0)
				continue;
			
			//根据imsi去重
			boolean repeact = false;
			for(int j=0; j returnType;	//返回类型
		public EMethod(String name, int type, Class returnType) {
			this.name = name;
			this.type = type;
			this.returnType = returnType;
		}
	}
}

传入TelephonyManager对象进行获取,返回JSONArray数据

TelephonyManager tel = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
JSONArray simList = SimUtils.getAllSimInfo(tel);

我的是双卡,返回的数据如下(对imsi等敏感数据进行了脱敏):

[
    {
        "NetworkTypeName":"UNKNOWN",
        "PhoneId":0,
        "PhoneType":1,
        "PhoneTypeFromNetworkType":1,
        "PhoneTypeFromProperty":1,
        "SubId":0,
        "CallState":0,
        "CdmaEriIconIndex":-1,
        "CdmaEriIconMode":-1,
        "CdmaEriText":"GSM nw, no ERI",
        "CurrentPhoneType":1,
        "DataNetworkType":13,
        "DeviceId":"869377032908354",
        "DeviceSoftwareVersion":"8693770329083576",
        "EmergencyCallbackMode":false,
        "GroupIdLevel1":"ffffffff",
        "Imei":"869377032908354",
        "Line1AlphaTag":"",
        "Line1Number":"",
        "LteOnCdmaMode":0,
        "Meid":"A000008E9D208E",
        "Msisdn":"",
        "NetworkCountryIso":"cn",
        "NetworkOperator":"46000",
        "NetworkOperatorName":"中国移动",
        "NetworkType":13,
        "SimCountryIso":"cn",
        "SimOperator":"46000",
        "SimOperatorName":"CMCC",
        "SimOperatorNumeric":"46000",
        "SimSerialNumber":"898600831915854xxxxx",
        "SimState":5,
        "SubscriberId":"4600007826xxxxx",
        "VoiceMailAlphaTag":"语音信箱",
        "VoiceMessageCount":0,
        "VoiceNetworkType":13
    },
    {
        "NetworkTypeName":"GPRS",
        "PhoneId":1,
        "PhoneType":1,
        "PhoneTypeFromNetworkType":0,
        "PhoneTypeFromProperty":2,
        "SubId":1,
        "CallState":0,
        "CdmaEriIconIndex":1,
        "CdmaEriIconMode":0,
        "CdmaEriText":"漫游指示符正在闪烁",
        "CurrentPhoneType":2,
        "DataNetworkType":13,
        "DeviceId":"A000008E9D208E",
        "DeviceSoftwareVersion":"8693770329822076",
        "EmergencyCallbackMode":false,
        "GroupIdLevel1":"ffffffff",
        "Imei":"869377032982201",
        "Line1Number":"",
        "LteOnCdmaMode":0,
        "Meid":"A000008E9D208E",
        "Msisdn":"",
        "Nai":"[email protected]",
        "NetworkCountryIso":"cn",
        "NetworkOperator":"46011",
        "NetworkOperatorName":"中国电信",
        "NetworkType":13,
        "SimCountryIso":"cn",
        "SimOperator":"46011",
        "SimOperatorName":"中国电信",
        "SimOperatorNumeric":"46011",
        "SimSerialNumber":"898603189502004xxxxx",
        "SimState":5,
        "SubscriberId":"4600312509xxxxx",
        "VoiceMailAlphaTag":"语音信箱",
        "VoiceMailNumber":"*86",
        "VoiceMessageCount":0,
        "VoiceNetworkType":7
    }
]

 

你可能感兴趣的:(Android开发——反射获取双卡Sim卡信息)