Android获取设备唯一标识的方法

Android获取设备唯一标识 一、IMEI:国际移动设备识别码的缩写,其总长为15位,每位数字仅使用0~9的数字。 双卡双待会有两个IMEI值,并且在Android10以后就无法获取到了,而且在模拟器中是可以修改的,所以该值无法作为识别设备唯一的标识。(如果只带有Wifi的设备或者音乐播放器没有通话的硬件功能的话就没有这个IMEI值) IMEI的获取方式: 1、Android6.0以前,无需任何权限通过getDeviceId()方法获取到IMEI码; 2、Android6.0-Android8.0之间,需要申请READ_PHONE_ST 阅读详情
String uniqueId;
String mac = getMacAddressByInetAddress();
if (mac != null && !mac.equals("") && !mac.equals("02:00:00:00:00:00")) {
    uniqueId = mac;
} else if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN_MR2 && getWidevineId() != null && !getWidevineId().equals("")) {
    uniqueId = getWidevineId();
} else {
    uniqueId = getPseudoID();
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getWidevineId() {
    String sRet = "";

    UUID WIDEVINE_UUID = new UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L);
    MediaDrm mediaDrm = null;

    try {
        mediaDrm = new MediaDrm(WIDEVINE_UUID);
        byte[] widevineId = mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(widevineId);

        sRet = bytesToHex(md.digest()); //we convert byte[] to hex for our purposes
    } catch (Exception e) {
        //WIDEVINE is not available
        e.printStackTrace();
        Log.d("debug", "获取(媒体数字版权管理(digit rights management)ID抛出异常)");
    } finally {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            if(null!=mediaDrm) {
                mediaDrm.close();
            }
        } else {
            if(null!=mediaDrm) {
                mediaDrm.release();
            }
        }
    }

    return sRet;
}

private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}

private String getMacAddressByInetAddress() {
    try {
        InetAddress inetAddress = getInetAddress();
        if (inetAddress != null) {
            NetworkInterface ni = NetworkInterface.getByInetAddress(inetAddress);
            if (ni != null) {
                byte[] macBytes = ni.getHardwareAddress();
                if (macBytes != null && macBytes.length > 0) {
                    StringBuilder sb = new StringBuilder();
                    for (byte b : macBytes) {
                        sb.append(String.format("%02x:", b));
                    }
                    return sb.substring(0, sb.length() - 1);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "02:00:00:00:00:00";
}

private InetAddress getInetAddress() {
    try {
        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
        while (nis.hasMoreElements()) {
            NetworkInterface ni = nis.nextElement();
            // To prevent phone of xiaomi return "10.0.2.15"
            if (!ni.isUp()) continue;
            Enumeration<InetAddress> addresses = ni.getInetAddresses();
            while (addresses.hasMoreElements()) {
                InetAddress inetAddress = addresses.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    String hostAddress = inetAddress.getHostAddress();
                    if (hostAddress.indexOf(':') < 0) return inetAddress;
                }
            }
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }
    return null;
}
public static String getPseudoID() {
    final int MODULUS = 10;
    StringBuilder sb = new StringBuilder();
    sb.append(Build.BOARD.length() % MODULUS);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        sb.append(java.util.Arrays.deepToString(Build.SUPPORTED_ABIS).length() % MODULUS);
    } else {
        // noinspection deprecation
        sb.append(Build.CPU_ABI.length() % MODULUS);
    }
    sb.append(Build.DEVICE.length() % MODULUS);
    sb.append(Build.DISPLAY.length() % MODULUS);
    sb.append(Build.HOST.length() % MODULUS);
    sb.append(Build.ID.length() % MODULUS);
    sb.append(Build.MANUFACTURER.length() % MODULUS);
    sb.append(Build.BRAND.length() % MODULUS);
    sb.append(Build.MODEL.length() % MODULUS);
    sb.append(Build.PRODUCT.length() % MODULUS);
    sb.append(Build.BOOTLOADER.length() % MODULUS);
    sb.append(Build.HARDWARE.length() % MODULUS);
    sb.append(Build.TAGS.length() % MODULUS);
    sb.append(Build.TYPE.length() % MODULUS);
    sb.append(Build.USER.length() % MODULUS);
    return sb.toString();
}
uniapp实战:3种方法获取Android设备唯一标识(IMEI/MAC/UUID)完整代码示例 本文针对Uniapp在Android平台获取设备唯一标识的常见需求,详细解析了三种核心方法:IMEI获取、MAC地址采集与UUID生成策略。文章深入探讨了Android系统版本(尤其是Android 10+)带来的权限限制与兼容性问题,并提供了完整的代码示例与智能降级方案,帮助开发者实现稳定可靠的设备识别功能。 阅读详情

相关推荐

获取Android设备唯一标识码

在实际开发中,可以根据需求选择合适的方式来获取设备的唯一标识码。需要注意的是,随着Android系统的更新和各种硬件设备的差异,不同的方法在不同的设备上的可靠性可能会有所不同。因此,在使用这些方法时,建议进行充分的测试和适配,以确保获取到正确的唯一标识码。对于开发者而言,有时需要获取Android设备的唯一标识码来进行识别和区分。需要注意的是,Android ID在某些设备上可能会发生变化,例如在恢复出厂设置或者刷机的情况下。需要注意的是,序列号并不是所有设备都支持,并且在某些设备上可能会返回空字符串。

ByteGlide的博客 572

获取安卓设备唯一标识方法总结

安卓设备的唯一标识的方法并不唯一,也没有哪种方法能够适用于所有的Android设备,下面列出几种常见的方式,可以根据需要选择。 1.IMEI 码 IMEI(国际移动设备识别码)唯一编号,用于识别 GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDM...

Sindyue的博客 1万+

浅谈android获取设备唯一标识完美解决方案

本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi); * 2, IMEI(imei); * 3, 序列号(sn); * 4, id:随机码。若前面的都取不到时,则随机生成一个随机码,需要缓存。 * * @param context * @return */ public static String getDeviceId(Co

android设备id完美解决方法,安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题...

一,先说获取渠道名(这里以友盟为例)/** 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量* */public static String getSource() {//获取渠道名String channelName ="huxiu";channelName = AnalyticsConfig.getChannel(APP.getInstance());//友盟提供的获取渠道名的方法。...

weixin_33473110的博客 3945

[原创]Keil工程STM32F103C8T6无缝转换到STM32F103RCT6

有个项目,老版本是STM32F103C8T6,硬件资源不够了,新版本采用STM32F103RCT6。 无缝过渡,如下: 选定芯片 宏定义改为STM32F10X_HD,USE_STDPERIPH_DRIVER 删除原有的启动汇编文件,更换为高密度器件汇编文件 时钟系统紊乱? 那得看你程序怎么写: 先看F103时钟树 int main(void) { unsigned char stat...

江东风又起 2万+

手机也能跑大模型?QNN框架实战:从模型量化到Android部署全流程

本文详细介绍了如何利用QNN框架将大模型部署到Android手机端进行端侧推理。通过实战演示了从模型量化(如INT4/INT8混合精度)到Android应用集成的全流程,包括内存优化、性能调优及常见问题排查,帮助开发者实现大模型在资源受限设备上的高效本地运行。

joy55的博客 500

安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7

【代码】安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7。

2401_84123077的博客 312

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 454

android apk唯一标识,Android设备获取唯一标识码的方法

【实例简介】Android设备获取唯一标识码的方法,可以用【实例截图】【核心代码】af9e3350-78eb-4335-8463-008ce5ebb093└── TestDemo01├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ └── exampl...

weixin_36368715的博客 652

STM32CubeMX定时器配置

因为只有当 CH2 处于 输入模式 时,硬件才能把这根脚送进滤波器(TI2FP2通道之前要滤波),再生成 TI2FP2 这条支路供 Slave-Mode 控制器使用,也就是说TI2FP2 并不是“独立存在”的,但在CubeMX配置时:如下图,我们只设置Slave Mode和TI1FP1,之后,CH1就自动配置为 Input Capture 了,下图发现,Channel1只能 Input Capture 或者Disable。哪来的主定时器和从定时器呢?把待测 PWM 的高电平当“门”,连接到ETR。

2402_89015641的博客 3185

0032期基于深度学习的大米识别-含数据集

083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。

grehtsfrs的博客 1507

安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题

安卓获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题,安卓获取渠道名

编程小石头 3936

基于STM32设计的环境监测系统(华为云IOT)_300

随着空气污染问题日益严峻,环境空气质量的监测变得愈加重要。为了解决这一问题,本项目设计并实现了一款基于STM32的空气质量监测设备,能够实时监测空气中的温湿度、二氧化碳浓度和甲醛浓度,并通过OLED显示屏展示数据。此外,设备支持通过WIFI模块将数据上传至云端,用户可以通过手机APP或Windows上位机查看实时数据。设备采用MQTT协议与华为云IOT物联网服务器进行数据通信,确保数据的实时性和可靠性。本项目还结合了低功耗设计和高灵敏度传感器,使得设备能够高效稳定地运行,并实现远程监控功能。

696

安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7(1)

【代码】安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7(1)

2401_84123077的博客 847

运放比较电路分析以及应用

摘要:本文介绍了基于LM321运放的同相输入型单限电压比较器电路。该电路通过运放开环工作模式实现电平判断:当输入信号Vs+>0V时输出+15V高电平,Vs+<0V时输出≈0V低电平。典型应用包括直流电压过零检测、交流信号整形、电池欠压报警和数字信号噪声过滤。电路具有结构简单(仅需1个运放和1个电阻)、成本低的优势,适用于传感器信号处理、波形转换等场景。使用时需注意参考电平调整、输出电平匹配等问题,如需抗噪声可增加正反馈电阻构成施密特触发器。该电路是运放实现简单电平逻辑的经典方案。

qq_37999850的博客 401

微信公众号 - 最新详细实现H5网页接入微信支付功能,开发移动端、PC端网站集成使用微信支付流程及示例代码,公众号网页利用JS-SDK/JSAPI/H5支付授权唤起微信支付,可脱离微信环境支付或内置浏

微信公众号,微信支付,网页,移动端,h5,扫码支付,二维码付款,手机网页,电脑pc网页生成支付二维码,js-sdk,jsapi,外部浏览器调起微信支付,脱离微信环境,在微信内置浏览器如何进行微信支付,前端H5微信支付,web网站,vue2,vue3,nuxt2,nuxt3,jquery,微信公众号h5支付流程,如何实现,怎么做,回调报错,redirect_uri参数错误,必须部署才能调试吗,怎么不打包发布就能在本机测试,微信H5支付能力,uniapp微信支付,h5页面调起支付,支付没反应,无效,失败,H5页

🏆 前端领域优质创作者 6103

Android设备获取唯一标识码的方法

原理:获取s import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.net.wif

cicilover的专栏 4036

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

安卓设备的唯一标识,获取的目的在于数据统计,广告归因分析等用途。常用作唯一标识的有IMEI,MEID,MAC地址,Android_id,UUID,OAID等。国际移动设备识别码(International Mobile Equipment Identity,IMEI),即通常所说的手机序列号、手机“串号”,用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。序列号共有15~17位数字,前8位(TAC)是型号核准号码(早期为6位),是区分手机品牌和型号的编码。

2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

uni-app获取设备的唯一标识

uni-app根据不同手机平台获取设备的唯一标识,由于获取的方式是异步的,当前页面执行不一定能拿到。建议存在缓存,其他地方可以用调用缓存的方式获取,不存在的话在执行一下方法获取,已保证一定能获取的到。 //获取客户端ID getClientId() { //获取客户端ID和版本号 var clientid = ''; // #ifdef APP-PLUS // 苹果系统 plus.device.getInfo({ success: function(e) { cl...

qq303522560qq的博客 1万+

Android 手机上获取物理唯一标识码

所有添加有谷歌账户的设备可以返回一个 ANDROID_ID所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添加了谷歌账户)   唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的。 import android.provider.Settings.Secure; privat

u012398902的专栏 497

【亲测免费】 Android_CN_OAID: 安卓设备唯一标识解决方案教程

--- ## 项目介绍 **Android_CN_OAID** 是一个专为安卓开发者设计的库,旨在提供一种便捷的方式来获取多种设备标识,特别是针对国内手机厂商的开放匿名标识(OAID)和海外设备的安卓广告标识(AAID)。此项目是为了替代那些企业级、需要特定资质的统一SDK,如移动安全联盟(MSA)提供的闭源方案。它不仅包含了OAID和AAID的获取,还兼容了IMEI、MEID、Android...

gitblog_00301的博客 1936

安卓获取手机唯一码工具类

Android手机,唯一码,有时候作为手机的唯一标示,要在程序中获取。但安卓手机因为厂家多,等原因,对于所有的安卓手机及pad,没有一个稳定可靠的手机标示码可以100%获得。 本文提供了一个解决方案,imei 、序列号(sn)、安卓号、wifi mac地址等等,一种一种的码去找,直到找到为止。就算最后没有找到,自己生成一个UUID,去标示该手机

WaterTheGreat的博客 881

获取Android设备唯一标识码的几种方式详解

获取Android设备唯一标识码的几种方法详解

shuqiaoniu的博客 2090

Android功能记录(一) ------ 获取手机唯一标识码

6.29增加漏掉的依赖文件 : import android.text.TextUtils; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOut...

千喜 767
上一篇: STM32三条总线(AHB、APB1、APB2)的外设映射情况
下一篇: jdk原生实现http的文件和参数同时上传
JianfeiMa
博客等级 码龄10年 61粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值