概述
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拦截策略所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复