详解关于AndroidQ获取不到imsi解决方案
AndroidQ禁止获取IMEI和设备序列号;
官方的解决方案是这样:https://developer.android.com/training/articles/user-data-ids
结合官方实现方案和实际需求自己整理的实现方法如下:
方案一:
/**
*获取设备唯一标识符
*
*@return唯一标识符
*/
publicstaticStringgetDeviceId(){
//通过SharedPreferences获取GUID
Stringguid=SPUtils.getInstance().getString(AppConfig.SP_GUID);
if(!TextUtils.isEmpty(guid)){
returnguid;
}
//获取ANDROID_ID
Stringandroid_id=Settings.System.getString(
App.getApp().getContentResolver(),Settings.Secure.ANDROID_ID);
if(!TextUtils.isEmpty(android_id)){
//通过ANDROID_ID生成guid(唯一标识符)
guid=EncryptUtils.encryptMD5ToString(android_id);
}else{
//通过UUID生成guid(唯一标识符)
guid=EncryptUtils.encryptMD5ToString(UUID.randomUUID().toString());
}
//保存guid到SharedPreferences
SPUtils.getInstance().put(AppConfig.SP_GUID,guid);
returnguid;
}
上面SPUtils是自己封装的SharedPreferences的一个工具类。
方案二:
/**
*获取设备唯一标识符
*
*@return唯一标识符
*/
@SuppressLint("HardwareIds")
publicstaticStringgetDeviceId(){
Stringm_szDevIDShort="35"+Build.BOARD.length()%10
+Build.BRAND.length()%10+Build.CPU_ABI.length()%10
+Build.DEVICE.length()%10+Build.DISPLAY.length()%10
+Build.HOST.length()%10+Build.ID.length()%10
+Build.MANUFACTURER.length()%10+Build.MODEL.length()%10
+Build.PRODUCT.length()%10+Build.TAGS.length()%10
+Build.TYPE.length()%10+Build.USER.length()%10;//13位
Stringserial="serial";//默认serial可随便定义
try{
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
if(ActivityCompat.checkSelfPermission(App.getApp(),
Manifest.permission.READ_PHONE_STATE)==PackageManager.PERMISSION_GRANTED){
//由于AndroidQ唯一标识符权限的更改会导致
//android.os.Build.getSerial()返回unknown,
//但是m_szDevIDShort是由硬件信息拼出来的,所以仍然保证了UUID的唯一性和持久性。
serial=android.os.Build.getSerial();//AndroidQ中返回unknown
}
}else{
serial=Build.SERIAL;
}
}catch(Exceptionignored){
}
returnnewUUID(m_szDevIDShort.hashCode(),serial.hashCode()).toString();
}
由于m_szDevIDShort是由硬件信息拼出来的,所以保证了UUID的唯一性和持久性。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。