我是靠谱客的博主 粗心菠萝,最近开发中收集的这篇文章主要介绍获取IMEI码:getDeviceId()和 getDeviceId(int slotIndex)比较,以及相应Xposed拦截策略,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

getDeviceId()和getDeviceId(int slotIndex)比较

 getDeviceId()和getDeviceId(Int)两个方法都是TelephonyManager类中获取IMEI码的方法,一般情况下,我们需要获取IMED码的时候,通常调用getDeviceId()方法,返回一条String字符串为获得的IMEI码。

getDeviceId(Int) 方法同样也是返回IMEI码,主要用于需要获取双SIM卡的手机IMEI码。我们都知道,双SIM卡的手机拥有两个卡槽,分别为卡1和卡2,所以,getDeviceId(Int)方法的参数Int指的是双SIM卡的下标,即卡1的下标为0,卡2的下标为1。getDeviceId(0)返回的是卡1的IMEI码,getDeviceId(1)返回的是卡2的IMEI码。

下面我们看一下源码:

getDeviceId():

public String getDeviceId() {
try {
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
return telephony.getDeviceId(mContext.getOpPackageName());
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
return null;
}
}

从源码中我们可以看到,首先程序通过getITelephony()方法获取了一个ITelephony接口的实例telephony,然后判断实例是否获取成功,没有拿到则返回null,获取成功则通过调用接口的getDeviceId()方法,传入该程序的包名,拿到IMEI码。

getDeviceId(Int):

public String getDeviceId(int slotIndex) {
// FIXME this assumes phoneId == slotIndex
try {
IPhoneSubInfo info = getSubscriberInfo();
if (info == null)
return null;
return info.getDeviceIdForPhone(slotIndex, mContext.getOpPackageName());
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
return null;
}
}

从源码中我们可以看出getDeviceId()和getdeviceId(Int)方法的不同。

在getDeviceId(Int)方法里,首先通过getSubscriberInfo()方法获取了IPhoneSubInfo接口实例。之后也是判断实例是否获取成功,获取成功则会调用接口的getDevicedIdForPhone()方法,传入想要获取的SIM卡的下标和该程序的包名,拿到相对应的SIM卡的IMEI码。

总结:

getDeviceId():

适用:单卡的手机设备。

作用:获取IMEI码。

内部调用:通过ITelephony接口的getDeviceId()方法。

传入参数:无。

getDeviceId(Int):

适用:双卡的手机设备。

作用:获取相应的SIM卡的IMEI码。

内部调用:通过IPhoneSubInfo接口的getDevicedIdForPhone()方法。

传入参数:相应的SIM卡下标。

提示:当手机仅插入的一张SIM卡,使用getDevicedId(Int)方法获取卡1和卡2的IMEI码,getDeviceId(0)和getDeviceId(1)返回值相同,都是仅有的一张SIM卡的IMEI码。

针对Xposed拦截修改以上两种方式获取IMEI码:

针对getDeviceId()方式获取IMEI码,正常Hook拦截即可:

XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//抓取到方法
}
});

针对getDeviceId(Int)方式获取IMEI码,需要钩子方法的参数补上整形类,表示钩取的为带参数的getDeviceId()方法:

XposedHelpers.findAndHookMethod(TelephonyManager.class, methodName, int.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("进入函数");
if ((int)param.args[0]==0){
XposedBridge.log("进入判断"+0);
param.setResult("testing");
}else {
XposedBridge.log("进入判断"+1);
param.setResult("testing");
}
}
});

其中可以在回调方法里对SIM卡下标进行判断,以达到修改相应的SIM卡的IMEI码目的。

引用本文请标明出处,谢谢!

最后

以上就是粗心菠萝为你收集整理的获取IMEI码:getDeviceId()和 getDeviceId(int slotIndex)比较,以及相应Xposed拦截策略的全部内容,希望文章能够帮你解决获取IMEI码:getDeviceId()和 getDeviceId(int slotIndex)比较,以及相应Xposed拦截策略所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部