在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(如果有权限且设备支持)。
相关推荐
宸津-代码粉碎机几秒前
Spring AI 企业级RAG实战|增量更新+文档去重+定时自动入库生产落地方案
java·大数据·人工智能·后端·python·spring
Raink老师2 分钟前
【AI面试临阵磨枪-92】Skill 开发规范:命名、文档、测试、日志、监控、告警?
java·面试·log4j
Evand J3 分钟前
【代码介绍】自适应R的AEKF(自适应扩展卡尔曼滤波)和经典EKF比较,MATLAB例程|三维非线性系统
开发语言·matlab·ekf·自适应·自适应滤波
zhangphil5 分钟前
Kotlin协程Flow及管道中的buffer和bufferCapacity
android·kotlin
雪的季节10 分钟前
1 个网络线程 + 3 个数据处理线程(完全隔离)
开发语言
weixin_4080996711 分钟前
2026 AI生成图片快速去水印的5种实测方法(附在线工具 + Python/Java/PHP API代码)
java·人工智能·python·api接口·ai去水印·石榴智能·自动去水印
风筝在晴天搁浅12 分钟前
快手 CodeTop LeetCode 227.基本计算器Ⅱ
java·开发语言
JAVA面经实录91715 分钟前
RabbitMQ全套学习知识手册
java·rabbitmq
恋猫de小郭15 分钟前
一个 Linux 调度器优化,让 Android 多耗 20% 的电,传音工程师如何发现问题?
android·前端·ios
0xDevNull17 分钟前
Java实战面试题(一)
java·开发语言