在Android中如何获取当前设备的ID

目录

[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_IDBuild.SERIALTelephonyManager

复制代码
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;
    }
}

代码说明:

  1. getAndroidId():这是最常用的方法,返回设备的 ANDROID_ID,它通常是唯一的,但某些设备在重置后可能会更改。
  2. getDeviceSerial():获取设备的序列号,适用于 Android 8.0 及以下。Android 9.0 后谷歌不推荐使用序列号作为唯一标识。
  3. getIMEI() :通过 TelephonyManager 获取设备的 IMEI 号码,需要权限,适用于有电话功能的设备。
  4. 权限管理:代码中包含了动态权限请求的部分,确保在 Android 6.0 及以上版本获取 IMEI 时不会崩溃。

注意事项:

  • Android 10 开始,获取设备的 IMEI 和序列号已被限制,应用程序无法再使用 TelephonyManager.getDeviceId()Build.getSerial() 获取这些信息。APP 开发者通常使用 ANDROID_ID 作为设备的唯一标识符。
  • 权限获取是必要的,对于 IMEI 这样的敏感信息,需要在应用的运行时动态请求权限。

输出结果:

根据设备情况,调用 getDeviceId() 方法会返回:

  • ANDROID_ID(优先使用)。
  • 序列号(如果适用)。
  • IMEI(如果有权限且设备支持)。
相关推荐
SlowFeather13 分钟前
Unity 使用 ADB 实时查看手机运行性能
android·unity·adb·性能优化·profiler
276695829220 分钟前
海关 瑞数 后缀分析 rs
java·python·rs·瑞数·海关·瑞数后缀·后缀生成
Android 小码峰啊31 分钟前
Android Compose 框架矢量图标深入剖析(七)
android
小臭希32 分钟前
Java——琐碎知识点一
java·开发语言
淋一遍下雨天1 小时前
Spark Streaming核心编程总结(四)
java·开发语言·数据库
小白学大数据2 小时前
如何避免爬虫因Cookie过期导致登录失效
开发语言·爬虫·python·scrapy
琢磨先生David2 小时前
重构数字信任基石:Java 24 网络安全特性的全维度革新与未来防御体系构建
java·web安全·密码学
程序修理员2 小时前
技能点总结
java
Jennifer33K2 小时前
报错_NoSuchMethodException: cn.mvc.entity.User.<init>()
java