在App开发中,有时需要获取一台设备的唯一编号(Id), 作为识别物理设备的依据。本文演示几种获取的方式。
不推荐使用的方法
处于安全和隐私的考虑,Android系统的 API 几经改变,很多获取唯一标识的方法已经不能使用了(后续还会补充):
- 从 TelephonyManager 对象中获取 deviceId。 该方法已经别标记为废弃,虽然现阶段一些版本还能调用成功,并能获取到值(该值其实是 IMEI 码)。
- 从 WifiManager 中获取 MAC 地址, 该帆帆没有被废弃,但返回的值都是一个虚拟的值:02:00:00:00:00:00, 所以也无法使用。
获取机器序列号
机器序列号也称为: 机器串号或硬件序列号,通常会在手机的说明书或是系统通用设置中可以找到,也可以在电话拨号盘上输入: “*#06#” 查询。
为获取机器序列号,首先需要在 AndroidManifest.xml 中加入以下代码,为应用程序申请相机相关权限
1 | <uses-permission android:name="android.permission.READ_PHONE_STATE" /> |
在代码中,通过调用以下代码即可获取:
1 | if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { |
代码段中加入了权限检查,并在无权限是调用 requestPermissions 动态申请权限。requestPermissions的最后一个参数自定义的 requestCode, 如果需要处理用户的选择,则需要在同一个 Activity 中覆盖 onRequestPermissionsResult 函数。形式上类似于从 Activity 中返回值的情况。
获取ANDRODI_ID
ANDROID_ID是Android系统第一次启动时产生的一个64bit(16BYTES)数,如果设备被wipe还原后,该ID将被重置(变化)。
为获取ANDROID_ID,首先需要在 AndroidManifest.xml 中加入以下代码,为应用程序申请相机相关权限
1 | <uses-permission android:name="android.permission.READ_PHONE_STATE" /> |
代码如下:
1 | if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { |