目录
[1. 使用 Build.SERIAL (适用于 Android 8.0 及以下)](#1. 使用 Build.SERIAL (适用于 Android 8.0 及以下))
[2. 使用 Settings.Secure 获取 ANDROID_ID (适用于 Android 2.3 及以上)](#2. 使用 Settings.Secure 获取 ANDROID_ID (适用于 Android 2.3 及以上))
[3. 使用 TelephonyManager 获取设备的 IMEI (仅适用于带有电话功能的设备,且需要权限)](#3. 使用 TelephonyManager 获取设备的 IMEI (仅适用于带有电话功能的设备,且需要权限))
[4. 获取设备的唯一 ID 示例代码(集成多个方法)](#4. 获取设备的唯一 ID 示例代码(集成多个方法))
1. 使用 Build.SERIAL
(适用于 Android 8.0 及以下)
// 获取设备的序列号
String deviceSerial = Build.SERIAL;
2. 使用 Settings.Secure
获取 ANDROID_ID (适用于 Android 2.3 及以上)
// 获取 ANDROID_ID,通常唯一,但有时会被重置
String androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
3. 使用 TelephonyManager
获取设备的 IMEI (仅适用于带有电话功能的设备,且需要权限)
在 Android 6.0 及以上,需要动态请求权限。
权限:
在 AndroidManifest.xml
中声明权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
请求动态权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
}
}
获取 IMEI:
// 获取 TelephonyManager 实例
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// 检查权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
// 获取 IMEI 号码 (Android 10 及以上不推荐使用)
String imei = telephonyManager.getDeviceId();
}
4. 获取设备的唯一 ID 示例代码(集成多个方法)
以下是获取设备唯一ID的完整示例代码,结合了 ANDROID_ID
、Build.SERIAL
和 TelephonyManager
:
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.core.app.ActivityCompat;
public class DeviceIdHelper {
// 获取设备唯一ID的主方法
public static String getDeviceId(Context context) {
String deviceId = null;
// 优先使用 ANDROID_ID
deviceId = getAndroidId(context);
if (deviceId != null && !deviceId.isEmpty()) {
Log.d("DeviceIdHelper", "ANDROID_ID: " + deviceId);
return deviceId;
}
// 如果 ANDROID_ID 不可用,使用序列号
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O) {
deviceId = getDeviceSerial();
if (deviceId != null && !deviceId.isEmpty()) {
Log.d("DeviceIdHelper", "SERIAL: " + deviceId);
return deviceId;
}
}
// 尝试使用 IMEI (需要 READ_PHONE_STATE 权限)
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
deviceId = getIMEI(context);
if (deviceId != null && !deviceId.isEmpty()) {
Log.d("DeviceIdHelper", "IMEI: " + deviceId);
return deviceId;
}
}
Log.d("DeviceIdHelper", "设备ID获取失败");
return "Unknown";
}
// 获取 ANDROID_ID
private static String getAndroidId(Context context) {
return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}
// 获取设备序列号 (适用于 Android 8.0 及以下)
private static String getDeviceSerial() {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O) {
return Build.SERIAL;
} else {
return Build.getSerial();
}
}
// 获取 IMEI 号码 (仅在电话功能设备上有效)
private static String getIMEI(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
return telephonyManager.getDeviceId();
}
return null;
}
}
代码说明:
getAndroidId()
:这是最常用的方法,返回设备的 ANDROID_ID,它通常是唯一的,但某些设备在重置后可能会更改。getDeviceSerial()
:获取设备的序列号,适用于 Android 8.0 及以下。Android 9.0 后谷歌不推荐使用序列号作为唯一标识。getIMEI()
:通过TelephonyManager
获取设备的 IMEI 号码,需要权限,适用于有电话功能的设备。- 权限管理:代码中包含了动态权限请求的部分,确保在 Android 6.0 及以上版本获取 IMEI 时不会崩溃。
注意事项:
- 从 Android 10 开始,获取设备的 IMEI 和序列号已被限制,应用程序无法再使用
TelephonyManager.getDeviceId()
和Build.getSerial()
获取这些信息。APP 开发者通常使用 ANDROID_ID 作为设备的唯一标识符。 - 权限获取是必要的,对于 IMEI 这样的敏感信息,需要在应用的运行时动态请求权限。
输出结果:
根据设备情况,调用 getDeviceId()
方法会返回:
- ANDROID_ID(优先使用)。
- 序列号(如果适用)。
- IMEI(如果有权限且设备支持)。