您的位置:首页 > 其它

通过反射机制,获得双卡双待机器的IMEI、IMSI、电话号码。

2016-01-28 14:39 537 查看
在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,有点奇怪。。。

获得,电话号码,采用:

Method getPhoneNumber=clazz.getDeclaredMethod("getLine1NumberForSubscriber",int.class)

反射机制,非常值得学习和思考,第一次使用,纪念一下!

具体反射的参考:

侯捷谈Java反射机制

/article/7702512.html

http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: