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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值