详解关于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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。