当前位置: 首页 > news >正文

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

目录

1. 使用 Build.SERIAL (适用于 Android 8.0 及以下)

2. 使用 Settings.Secure 获取 ANDROID_ID (适用于 Android 2.3 及以上)

3. 使用 TelephonyManager 获取设备的 IMEI (仅适用于带有电话功能的设备,且需要权限)

权限:

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_IDdeviceId = 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_IDprivate 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(如果有权限且设备支持)。

http://www.mrgr.cn/news/12608.html

相关文章:

  • 一、菜单扩展
  • 决策树和随机森林介绍
  • [网鼎杯2018] Comment
  • 网络互联基础
  • error on “nvm list available“, find the final solution by the Second error
  • 【Resoved】编译 OpenCV 4.5.5 源码,fatal error: mpi.h: No such file or directory
  • SQLAlchemy 在 Python 中的同步与异步操作及CRUD实现指南
  • 【Android 设备上的所有相关 WiFi 命令和使用方法】
  • Qt QTableWidget可编辑设置,设置部分可编辑
  • Java基础——自学习使用(泛型)
  • 游戏开发设计模式之单例模式
  • Python目录页
  • 如何使用ssm实现基于java web的计算机office课程平台设计与实现+vue
  • C++的内存管理
  • 目标检测:从主干网络到检测头的全面剖析
  • 迭代器的失效问题
  • 【RabbitMQ工作原理相关】
  • 如何在算家云搭建模型Linly-Dubbing(语音识别)
  • 谷歌浏览器http自动跳转https问题
  • 利用 Redisson 实现延迟消息队列:一种高效订单取消方案