在Android 5.0之前,获得双卡相关信息,非常麻烦,不同的平台,有不同的实现方法,原生android不支持。
从android5.0开始,原始android已经支持双卡双待,例如IMEI信息:可以通过:方法实现如下:
public String getImei(int slotId) { 637 long[] subId = SubscriptionManager.getSubId(slotId); 638 try { 639 return getSubscriberInfo().getImeiForSubscriber(subId[0]); 640 } catch (RemoteException ex) { 641 return null; 642 } catch (NullPointerException ex) { 643 return null; 644 } 645 }
但是直接调用的发现,没有此方法。
仔细查看,发现,这个是隐函数,看说明:
/** 628 * Returns the IMEI. Return null if IMEI is not available. 629 * 630 * <p>Requires Permission: 631 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 632 * 633 * @param slotId of which deviceID is returned 634 */ 635 /** {@hide} */
那么直接反射法调用吧:
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Class clazz = manager.getClass();
Method getImei=clazz.getDeclaredMethod("getImei",int.class);//(int slotId)
//获得IMEI 1的信息:
getImei.invoke(manager, 0);
//获得IMEI 2的信息:
getImei.invoke(manager, 1);
同理,获得IMSI,采用:
Method getImsi=clazz.getDeclaredMethod("getSubscriberId",int.class).
但为什么不用long.class ,而采用int.class,有点奇怪。。。
获得,电话号码,采用:
MethodgetPhoneNumber=clazz.getDeclaredMethod("getLine1NumberForSubscriber",int.class)
反射机制,非常值得学习和思考,第一次使用,纪念一下!
具体反射的参考:
侯捷谈Java反射机制
http://blog.csdn.net/njchenyi/article/details/1620939
http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html