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;
}
获取不到是因为权限没有开放,要做一下配置:
加入权限
在manifestxml文件中要添加 <uses-permission android:name="androidpermissionREAD_PHONE_STATE" />
实现方法参考代码
package netsunniwellapp;
import androidappActivity;
import androidosBundle;
import androidtelephonyCellLocation;
import androidtelephonyPhoneStateListener;
import androidtelephonyTelephonyManager;
public class TelManager extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
TelephonyManager tm = (TelephonyManager) thisgetSystemService(TELEPHONY_SERVICE);
/
电话状态:
1tmCALL_STATE_IDLE=0 无活动
2tmCALL_STATE_RINGING=1 响铃
3tmCALL_STATE_OFFHOOK=2 摘机
/
tmgetCallState();//int
/
电话方位:
/
tmgetCellLocation();//CellLocation
/
唯一的设备ID:
GSM手机的 IMEI 和 CDMA手机的 MEID
Return null if device ID is not available
/
tmgetDeviceId();//String
/
设备的软件版本号:
例如:the IMEI/SV(software version) for GSM phones
Return null if the software version is not available
/
tmgetDeviceSoftwareVersion();//String
/
手机号:
GSM手机的 MSISDN
Return null if it is unavailable
/
tmgetLine1Number();//String
/
附近的电话的信息:
类型:List<NeighboringCellInfo>
需要权限:androidManifestpermission#ACCESS_COARSE_UPDATES
/
tmgetNeighboringCellInfo();//List<NeighboringCellInfo>
/
获取ISO标准的国家码,即国际长途区号。
注意:仅当用户已在网络注册后有效。
在CDMA网络中结果也许不可靠。
/
tmgetNetworkCountryIso();//String
/
MCC+MNC(mobile country code + mobile network code)
注意:仅当用户已在网络注册时有效。
在CDMA网络中结果也许不可靠。
/
tmgetNetworkOperator();//String
/
按照字母次序的current registered operator(当前已注册的用户)的名字
注意:仅当用户已在网络注册时有效。
在CDMA网络中结果也许不可靠。
/
tmgetNetworkOperatorName();//String
/
当前使用的网络类型:
例如: NETWORK_TYPE_UNKNOWN 网络类型未知 0
NETWORK_TYPE_GPRS GPRS网络 1
NETWORK_TYPE_EDGE EDGE网络 2
NETWORK_TYPE_UMTS UMTS网络 3
NETWORK_TYPE_HSDPA HSDPA网络 8
NETWORK_TYPE_HSUPA HSUPA网络 9
NETWORK_TYPE_HSPA HSPA网络 10
NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B 4
NETWORK_TYPE_EVDO_0 EVDO网络, revision 0 5
NETWORK_TYPE_EVDO_A EVDO网络, revision A 6
NETWORK_TYPE_1xRTT 1xRTT网络 7
/
tmgetNetworkType();//int
/
手机类型:
例如: PHONE_TYPE_NONE 无信号
PHONE_TYPE_GSM GSM信号
PHONE_TYPE_CDMA CDMA信号
/
tmgetPhoneType();//int
/
Returns the ISO country code equivalent for the SIM provider's country code
获取ISO国家码,相当于提供SIM卡的国家码。
/
tmgetSimCountryIso();//String
/
Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM 5 or 6 decimal digits
获取SIM卡提供的移动国家码和移动网络码5或6位的十进制数字
SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断)
/
tmgetSimOperator();//String
/
服务商名称:
例如:中国移动、联通
SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断)
/
tmgetSimOperatorName();//String
/
SIM卡的序列号:
需要权限:READ_PHONE_STATE
/
tmgetSimSerialNumber();//String
/
SIM的状态信息:
SIM_STATE_UNKNOWN 未知状态 0
SIM_STATE_ABSENT 没插卡 1
SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2
SIM_STATE_PUK_REQUIRED 锁定状态,需要用户的PUK码解锁 3
SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4
SIM_STATE_READY 就绪状态 5
/
tmgetSimState();//int
/
唯一的用户ID:
例如:IMSI(国际移动用户识别码) for a GSM phone
需要权限:READ_PHONE_STATE
/
tmgetSubscriberId();//String
/
取得和语音邮件相关的标签,即为识别符
需要权限:READ_PHONE_STATE
/
tmgetVoiceMailAlphaTag();//String
/
获取语音邮件号码:
需要权限:READ_PHONE_STATE
/
tmgetVoiceMailNumber();//String
/
ICC卡是否存在
/
tmhasIccCard();//boolean
/
是否漫游:
(在GSM用途下)
/
tmisNetworkRoaming();//
}
}
方法如下:
1、“手机管家”APP中权限管理,进入“手机管家”APP点开权限隐私点击权限管理,根据实际需求设置应用权限。
2、设置中的权限管理,进入手机设置找到权限与隐私打开权限管理,根据实际需求设置应用权限。
3、单个应用权限管理,单独设置桌面应用权限,可长按桌面应用图标点击应用信息打开应用权限,根据实际需求设置应用权限。
一、简介
1、设备ID:
简单来说就是一串符号(或者数字)类似于我们的身份z号,映射现实中硬件设备。排除特殊情况(模拟器等),设备ID和设备是一一对应的,我们称之为“唯一设备ID(Unique Device Identifier)
2、设备ID的作用:
关于设备ID的作用,大概可以分为下面几点:
统计需求
统计需求是设备ID最常见的用途,包括DAU, MAU的统计,行为统计,广告激活的统计等。
业务需求
设备ID通常也用于业务中。比如结合行为统计做用户画像,以为用户提供个性化的服务,大家感受比较明显的就是新闻类和电商类的APP了。
这类 *** 作,有利有弊,仁者见仁智者见智。
又如,定向推送,不一定是广告推送,错误修复,内测推送等也会用到设备ID。
还有是一些和特定业务结合的用途,比如构造分布式ID等。风控需求,设备ID还可用于防刷单,反作弊等。
当然,风控需求仅靠设备ID是无法完成的,通常需要建立一套反作弊系统。
其他的过多,不一一赘叙
3、对于Android平台而言,没有稳定的API可以让开发者获取到这样的设备ID,这样对id的获取便不是很友好,加之各种模拟器,获取不到的情况比比皆是。
下面我们简单介绍一下常用的设备ID及其获取方法
二、获取设备ID
1、ANDROID_ID
Android ID 是获取门槛最低的,不需要任何权限,64bit 的取值范围,唯一性算是很好的了。
但是不足之处也很明显:
1、刷机、root、恢复出厂设置等会使得 Android ID 改变;
2、Android 80之后,Android ID的规则发生了变化:
对于升级到80之前安装的应用,ANDROID_ID会保持不变。如果卸载后重新安装的话,ANDROID_ID将会改变。
对于安装在80系统的应用来说,ANDROID_ID根据应用签名和用户的不同而不同。ANDROID_ID的唯一决定于应用签名、用户和设备三者的组合。
两个规则导致的结果就是:
第一,如果用户安装APP设备是80以下,后来卸载了,升级到80之后又重装了应用,Android ID不一样;
第二,不同签名的APP,获取到的Android ID不一样。
其中第二点可能对于广告联盟之类的有所影响(如果彼此是用Android ID对比数据的话),所以Google文档中说“请使用Advertising ID”,
不过大家都知道,Google的服务在国内用不了。对Android ID做了约束,对隐私保护起到一定作用,并且用来做APP自己的活跃统计也还是没有问题的。
获取方法如下:
String android_id = SettingsSystemgetString(contextgetContentResolver(), SettingsSystemANDROID_ID);
1
1
2、IMEI
IMEI本该最理想的设备ID,具备唯一性,恢复出厂设置不会变化(真正的设备相关)。然而,获取IMEI需要 READ_PHONE_STATE 权限,估计大家也知道这个权限有多麻烦了。尤其是Android 60以后, 这类权限要动态申请,很多用户可能会选择拒绝授权。我们看到,有的APP不授权这个权限就无法使用, 这可能会降低用户对APP的好感度。
而且,Android 100 将彻底禁止第三方应用获取设备的IMEI, 即使申请了 READ_PHONE_STATE 权限。
所以,如果是新APP,不建议用IMEI作为设备标识;
如果已经用IMEI作为标识,要赶紧做兼容工作了,尤其是做新设备标识和IMEI的映射。
获取方法如下:
try {
TelephonyManager tm = (TelephonyManager)contextgetSystemService(ServiceTELEPHONY_SERVICE);
//如果双卡,获取第一张卡的
android_IMEI = tmgetDeviceId(0);
SharedPreferencesUtilsetPrefString(context, LxKeysID_IMEI, android_IMEI);
} catch (Exception e) {
eprintStackTrace();
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
3、MAC
获取MAC地址也是越来越困难了,
Android 60以后通过 WifiManager 获取到的mac将是固定的:02:00:00:00:00:00 ,
再后来连读取 /sys/class/net/wlan0/address 也获取不到了。
如今只剩下面这种方法可以获取(没有开启wifi也可以获取到):
public static String getWifiMac() {
try {
Enumeration<NetworkInterface> enumeration = NetworkInterfacegetNetworkInterfaces();
if (enumeration == null) {
return "";
}
while (enumerationhasMoreElements()) {
NetworkInterface netInterface = enumerationnextElement();
if (netInterfacegetName()equals("wlan0")) {
return formatMac(netInterfacegetHardwareAddress());
}
}
} catch (Exception e) {
Loge("tag", egetMessage(), e);
}
return "";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4、OAID
简介:
因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。
近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。(可能存在的问题:部分厂商还没有支持,不过随着更新版本,越来越多的手机已经纳入到兼容范围了)
游戏要求获取imei权限?答案是应用程序需要这个权限会自动提示获取的。如果没有进行提示,想要允许,可以进入手机设置应用管理权限管理,在权限管理里可以启用软件的权限。所以以上是游戏要求获取imei权限的解决方法
UICC初始化失败。是其中之一。第二权限问题。UICC初始化属于底层的一些东西,一本书不一定说的明白,大致就是这样一个过程,你调用一些封装好的API调用通信框架的函数,调用RIL *** 作调制解调器。如果这中间任何一个环节不通畅,都会导致获取不到结果。一个手机开机,都必须初始化调制解调器和UICC。所以我说初始化失败也是原因之一。
以上就是关于android 代码获取IMEI,IMSI都为空,怎么解决全部的内容,包括:android 代码获取IMEI,IMSI都为空,怎么解决、为什么在Android2.3.4下获取不到IMEI、oppo手机如何允许程序获取imei码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)