va获得android的imei号权限添加 TelephonyManager telephonyManager = (TelephonyManager) this getSystemService(ContextTELEPHONY_SERVICE); String IMEI = telephonyManagergetDeviceId(); adb命令获得:adb shell dumpsys iphonesubinfo有时候返回为空是因为,模块电源关闭了。重置后需要打开模块电源才能读出来查看机器的一些系统设置参数adb shell getprop
getSimSerialNumber()是获取IMEI的
getSubscriberId()才是获取IMSI的
MTK的是getSubscriberIdGemini(int simId)
对应的getSimSerialNumberGemini(int simId)
高通平台有单独的类MSimTelephonyManager里面有方法
getSubscriberId(int simId)
getSimSerialNumber(int simId)
高通平台接口不太确定各个厂商是否都是这样据说之前高通双卡方案代码是外包的,可能不太一样
simId 0应该是主卡 1是次卡
要用反射掉,不是原生接口
1
打开手机
2
通常情况下,在拨号界面输入 #06# (不同厂商的手机所需输入的内容不同,同一厂商不同手机所需输入的内容也可能不同,详细请查询对应手机型号)
3
即可回显出当前手机设备的IMEI
4
如果手机上无法找到,一般可以在手机的外包装上找到
5
将获取的IMEI到 电信设备进网管理页面 可以查询核实。
Android获取IMSI和IMEI :
IMSI是一个唯一的数字,标识了GSM和UMTS 网络里的唯一一个用户
它存储 在手机的SIM卡里,它会通过手机发送到网络上。
IMEI也是一串唯一的数字,标识了GSM 和UMTS网络里的三星 Galaxy I9100。
它通常被打印在手机里电池下面的那一面,拨 #06# 也能看到它。
代码:
这里是你在Android里读出 唯一的 IMSI-ID / IMEI-ID 的方法。
Java:
String myIMSI =
androidosSystemPropertiesget(androidtelephonyTelephonyPropertiesPROPERTY_IMSI
);
// within my emulator it returns: 310995000000000
String myIMEI =
androidosSystemPropertiesget(androidtelephonyTelephonyPropertiesPROPERTY_IMEI
);
// within my emulator it returns: 000000000000000
手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手
机号码的数据写入到sim卡中。sim卡只有唯一的编号,供网络与设备识别那就是imsi号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。
试想,你的sim丢失后,补办一张新的会换号码吗 —不会就是因为在你的手机号码对应的 imsi号在移动运营商中被修改成新sim卡的imsi号码。
这个就像是一个变量,当移动运营商为它赋值了,它自然就会有值。不赋值自然为空。
/ 获得手机的一些标志符 @param c @return String 手机的类型 /
public String fetch_status(Context c) {
TelephonyManager tm = (TelephonyManager) c
getSystemService(ContextTELEPHONY_SERVICE);//
String str = "";
String IMSI = tmgetSubscriberId();
str += "DeviceId(IMEI) = " + tmgetDeviceId() + "/n";
str += "DeviceSoftwareVersion = " + tmgetDeviceSoftwareVersion()
+ "/n";
str += "Line1Number = " + tmgetLine1Number() + "/n";
return str;
}
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ContextTELEPHONY_SERVICE);String imsi = mTelephonyMgrgetSubscriberId();String imei = mTelephonyMgrgetDeviceId();Logi("IMSI", imsi);Logi("IMEI", imei);
在Android中,有以下几种方法获取这样的ID。
1 The IMEI: 仅仅只对Android手机有效:
TelephonyManager TelephonyMgr =
(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgrgetDeviceId(); // Requires
READ_PHONE_STATE
采用此种方法,需要在AndroidManifestxml中加入一个许可:androidpermissionREAD_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是唯一的,它应该类似于
359881030314356(除非你有一个没有量产的手机(水货)它可能有无效的IMEI,如:0000000000000)。
2 Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得唯一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是唯一的(因为如果两个手机应用了同样的硬件以及Rom
镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
BuildBOARDlength()%10+ BuildBRANDlength()%10 +
BuildCPU_ABIlength()%10 + BuildDEVICElength()%10 + BuildDISPLAYlength()%10
+ BuildHOSTlength()%10 + BuildIDlength()%10 + BuildMANUFACTURERlength()%10
+ BuildMODELlength()%10 + BuildPRODUCTlength()%10 + BuildTAGSlength()%10 +
BuildTYPElength()%10 + BuildUSERlength()%10 ; //13 digits
大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。
3 The Android ID ,
通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
String m_szAndroidID = SecuregetString(getContentResolver(),
SecureANDROID_ID);
Returns: 9774d56d682e549c 无需任何许可。
4 The WLAN MAC Address string,
是另一个唯一ID。但是你需要为你的工程加入androidpermissionACCESS_WIFI_STATE 权限,否则这个地址会为null。
WifiManager wm = (WifiManager)getSystemService(ContextWIFI_SERVICE);
String m_szWLANMAC = wmgetConnectionInfo()getMacAddress();
Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。)WLan不必打开,就可读取些值。
5 The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入androidpermissionBLUETOOTH
权限
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdaptergetDefaultAdapter();
String m_szBTMAC = m_BluetoothAdaptergetAddress();
Returns: 43:25:78:50:93:38 蓝牙没有必要打开,也能读取。
Combined Device ID
综上所述,我们一共有五种方式取得设备的唯一标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,最好的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。
String m_szLongID = m_szImei + m_szDevIDShort
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// compute md5
MessageDigest m = null;
try {
m = MessageDigestgetInstance("MD5");
} catch (NoSuchAlgorithmException e) {
eprintStackTrace();
}
mupdate(m_szLongIDgetBytes(),0,m_szLongIDlength());
// get md5 bytes
byte p_md5Data[] = mdigest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i<p_md5datalength;i++) p="" {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper
padding)
if (b <= 0xF)
m_szUniqueID+="0";
// add number to string
m_szUniqueID+=IntegertoHexString(b);
} // hex string to uppercase
m_szUniqueID = m_szUniqueIDtoUpperCase();
通过以上算法,可产生32位的16进制数据:
9DDDF85AFF0A87974CE4541BD94D5F55
Android设备不同类型的识别设备ID。·唯一编号(IMEI,MEID,ESN,IMSI)·MAC地址·序列号·ANDROID_ID唯一编号(IMEI,MEID,ESN,IMSI)说明在以前,当Android设备均作为电话使用时,寻找唯一标识号比较简单:()可用于找到(取决于网络技术)手机硬件唯一的IMEI,MEID,ESN和IMSI编号。TelephonyManagergetDeviceIdIMEI,MEID,ESN,IMSI的定义如下:•IMEI(国际移动设备识别码)唯一编号,用于识别GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:•MEID•ESN•IMSIimportandroidtelephonyTelephonyManager;importandroidcontentContext;Stringimeistring=null;Stringimsistring=null;{TelephonyManagertelephonyManager;telephonyManager=(TelephonyManager)getSystemService(ContextTELEPHONY_SERVICE);/getDeviceId()functionReturnstheuniquedeviceIDforexample,theIMEIforGSMandtheMEIDorESNforCDMAphones/imeistring=telephonyManagergetDeviceId();/getSubscriberId()functionReturnstheuniquesubscriberID,forexample,theIMSIforaGSMphone/imsistring=telephonyManagergetSubscriberId();}
以上就是关于如何在android下用c语言获取imei号码全部的内容,包括:如何在android下用c语言获取imei号码、android怎么获得双卡imsi和imei、如何查询android手机imei号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)