在App开发中,有时需要获取一台设备的唯一编号(Id), 作为识别物理设备的依据。本文演示几种获取的方式。

不推荐使用的方法

处于安全和隐私的考虑,Android系统的 API 几经改变,很多获取唯一标识的方法已经不能使用了(后续还会补充):

  1. 从 TelephonyManager 对象中获取 deviceId。 该方法已经别标记为废弃,虽然现阶段一些版本还能调用成功,并能获取到值(该值其实是 IMEI 码)。
  2. 从 WifiManager 中获取 MAC 地址, 该帆帆没有被废弃,但返回的值都是一个虚拟的值:02:00:00:00:00:00, 所以也无法使用。

获取机器序列号

机器序列号也称为: 机器串号或硬件序列号,通常会在手机的说明书或是系统通用设置中可以找到,也可以在电话拨号盘上输入: “*#06#” 查询。

为获取机器序列号,首先需要在 AndroidManifest.xml 中加入以下代码,为应用程序申请相机相关权限

1
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

在代码中,通过调用以下代码即可获取:

1
2
3
4
5
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_PHONE_STATE}, 10);
} else {
String sn = android.os.Build.getSerial();
}

代码段中加入了权限检查,并在无权限是调用 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
2
3
4
5
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_PHONE_STATE}, 10);
} else {
String androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
}