Максим Asked:2020-05-01 00:33:49 +0000 UTC2020-05-01 00:33:49 +0000 UTC 2020-05-01 00:33:49 +0000 UTC 如何在 Android 中获取 IMEI? 772 如何获取设备IMEI?有两个功能: getImei() 获取设备ID() 哪个更好用?如何在 Android 10 (SDK 29) 上获取 IMEI? android 2 个回答 Voted Best Answer Максим 2020-05-01T00:33:49Z2020-05-01T00:33:49Z 为了用户隐私,Google 不建议使用硬件设备 ID。如: IMEI 序列号 MAC 地址(WiFi、蓝牙) 也不建议使用软件 SSAID(Android ID)。 获取 IMEI 需要权限READ_PHONE_STATE,在Android 10 (SDK 29) 中,现在需要权限READ_PRIVILEGED_PHONE_STATE,该权限仅适用于系统应用。 事实证明,使用 SDK 29,对于非系统应用程序,不再有合法的方式获取 IMEI。 如果可能,此方法将返回IMEI,否则null: @SuppressLint("HardwareIds") public static String getImei(Context context) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return null; //Доступен только системным приложениям } else { if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return null; //Нет доступа к звонилке } TelephonyManager telephonyManager = (TelephonyManager) Application.getInstance().getSystemService(Context.TELEPHONY_SERVICE); if(telephonyManager == null) { return null; //Нет звонилки } try { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return telephonyManager.getImei(); } else { return telephonyManager.getDeviceId(); } } catch (Exception e) { Log.w("Device", "Failed to get IMEI."); return null; } } } Vlad Orlinskas 2020-08-05T21:44:25Z2020-08-05T21:44:25Z 正如Maxim所说,不建议使用IMEI来识别设备。但是这个解决方案可能对你有用,它允许你创建一个设备标识符,但我不保证它的唯一性和可重复性。也许这会引导您找到更好的解决方案。 object UniqueId { @Suppress("DEPRECATION") fun generate(): String { val abisLength: Int abisLength = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { val abis = StringBuilder() for (abi in Build.SUPPORTED_ABIS) { abis.append(abi) } abis.toString().length } else { Build.CPU_ABI.length } val devIdShort = "35" + Build.BOARD.length % 10 + Build.BRAND.length % 10 + abisLength % 10 + Build.DEVICE.length % 10 + Build.MANUFACTURER.length % 10 + Build.MODEL.length % 10 + Build.PRODUCT.length % 10 val serial = try { "${android.os.Build::class.java.getField("SERIAL").get(null)}" } catch (exception: Exception) { "serial" } return UUID(devIdShort.hashCode().toLong(), serial.hashCode().toLong()).toString() } }
为了用户隐私,Google 不建议使用硬件设备 ID。如:
也不建议使用软件 SSAID(Android ID)。
获取 IMEI 需要权限
READ_PHONE_STATE
,在Android 10 (SDK 29) 中,现在需要权限READ_PRIVILEGED_PHONE_STATE
,该权限仅适用于系统应用。事实证明,使用 SDK 29,对于非系统应用程序,不再有合法的方式获取 IMEI。
如果可能,此方法将返回IMEI,否则
null
:正如Maxim所说,不建议使用IMEI来识别设备。但是这个解决方案可能对你有用,它允许你创建一个设备标识符,但我不保证它的唯一性和可重复性。也许这会引导您找到更好的解决方案。