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

来源:互联网 发布:php继承一个普通类 编辑:程序博客网 时间:2024/06/05 17:18

在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 returned634     */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反射机制

http://blog.csdn.net/njchenyi/article/details/1620939


http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html



1 0
原创粉丝点击