Android设备的各种唯一标识符 ID

这篇具有很好参考价值的文章主要介绍了Android设备的各种唯一标识符 ID。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IMEI

只有Android手机才有, IMEI号是一串15位的号码,比如像这样 359881030314356

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDeviceId();

需要权限android.permission.READ_PHONE_STATE
通常用户会因为你向他们要了这个权限而给你一个差评,因为他们觉得你就是在窃取他们的隐私,很明显,你就是在收集一些数据

Android ID

这个是不靠谱的,因为有时候它是null的,文档中明确说明,如果你恢复了出厂设置,那他就会改变的。而且如果你root了手机,你也可以手动改变这个ID。

String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

它返回的是9774d56d682e549c这样一串东西,倒是不需要什么权限。
部分设备由于制造商错误实现,导致多台设备会返回相同的 Android_ID.

WLAN MAC地址

这也可以得到一个独一无二的ID号,返回的是 00:11:22:33:44:55 。但是当没有wifi的时候,我们是无法获得数据的。

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();

需要权限 android.permission.ACCESS_WIFI_STATE

蓝牙MAC地址

市面上大部分的应用不使用蓝牙,如果你的应用根本没用蓝牙,而你却和用户要了蓝牙权限的,那你很可疑。

BluetoothAdapter m_BluetoothAdapter = null;
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress();

需要权限android.permission.BLUETOOTH

设备序列号(Serial Number, SN)

获取办法:

String serialNum = android.os.Build.SERIAL;
// android 8.0之后要用下面
String serialNum = android.os.Build.getSerial()

比如 01b4549262d6a4a2,是比较稳定的设备硬件标识符
从api 26:android 8.0 oreo开始,需要 android.permission.READ_PHONE_STATE 权限。不推荐使用

AAID 和 OAID

AAID是Android平台内的广告跟踪ID,OAID为AAID在国内的替代ID。

由于AAID依托于Google服务框架,但在国内使用Google服务并不可行,而且大部分国产手机内置的Google服务并不完整,所以App开发者需要寻找新的方式去标识用户,于是OAID应运而生。

可以通过miit_mdid包来获取AAID和OAID。

下载miit_mdid_1.0.10.aar,放进项目的libs路径下

在模块的<build.gradle>的dependencies段加入:

implementation fileTree(dir: 'libs', include: ['*.aar'])
//初始化
fun initJLibrary(context: Context?) {
    if (Build.VERSION.SDK_INT > 28) {
        JLibrary.InitEntry(context)
    }
}

// MdidSdkHelper.InitSdk的回调函数中获取oaid和aaid

@Synchronized
fun updateOaidIfNull(context: Context?) {
    if (Build.VERSION.SDK_INT <= 28)
        return

    MdidSdkHelper.InitSdk(context, true,
        IIdentifierListener { z, idSupplier ->
            val oaid = idSupplier.oaid
            var aaid = idSupplier.aaid

Pseudo ID

使用硬件信息拼凑出来的15位号码

/**
 * Return pseudo unique ID
 * @return ID
 */
public static String getPsuedoUniqueID()
{
    // If all else fails, if the user does have lower than API 9 (lower
    // than Gingerbread), has reset their phone or 'Secure.ANDROID_ID'
    // returns 'null', then simply the ID returned will be solely based
    // off their Android device information. This is where the collisions
    // can happen.
    // Thanks http://www.pocketmagic.net/?p=1662!
    // Try not to use DISPLAY, HOST or ID - these items could change.
    // If there are collisions, there will be overlapping data
    String m_szDevIDShort = "35" +
            (Build.BOARD.length() % 10)
            + (Build.BRAND.length() % 10)
            + (Build.CPU_ABI.length() % 10)
            + (Build.DEVICE.length() % 10)
            + (Build.MANUFACTURER.length() % 10)
            + (Build.MODEL.length() % 10)
            + (Build.PRODUCT.length() % 10);

    // Thanks to @Roman SL!
    // http://stackoverflow.com/a/4789483/950427
    // Only devices with API >= 9 have android.os.Build.SERIAL
    // http://developer.android.com/reference/android/os/Build.html#SERIAL
    // If a user upgrades software or roots their phone, there will be a duplicate entry
    String serial = null;
    try
    {
        serial = android.os.Build.class.getField("SERIAL").get(null).toString();

        // Go ahead and return the serial for api => 9
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }
    catch (Exception e)
    {
        // String needs to be initialized
        serial = "serial"; // some value
    }

    // Thanks @Joe!
    // http://stackoverflow.com/a/2853253/950427
    // Finally, combine the values we have found by using the UUID class to create a unique identifier
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

Widevine ID

DRM数字版权管理ID

MediaDrm 是一个 Android 框架 API,允许用户安全地向 MediaCodec 提供加密密钥,以便以安全的方式播放优质内容。

MediaDrm 与不同的 DRM 提供商合作。Google 的 Widevine,以及 Microsoft 的 PlayReady,具体取决于设备。

当设备第一次使用 DRM 时,会发生设备配置,这意味着设备将获得唯一的证书,并将存储在设备的 DRM 服务中。

此配置文件具有唯一 ID,您可以通过简单的调用获取它。

/**
 * 获取数字版权管理设备ID
 *
 * @return WidevineID,可能为空
 */
public static String getWidevineID() {
    try {
        //See https://stackoverflow.com/questions/16369818/how-to-get-crypto-scheme-uuid
        //You can find some UUIDs in the https://github.com/google/ExoPlayer source code
        final UUID WIDEVINE_UUID = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);
        MediaDrm mediaDrm = new MediaDrm(WIDEVINE_UUID);
        byte[] widevineId = mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);
        if (widevineId == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (byte aByte : widevineId) {
            sb.append(String.format("%02x", aByte));
        }
        return sb.toString();
    } catch (Exception e) {
        OAIDLog.print(e);
    } catch (Error e) {
        OAIDLog.print(e);
    }
    return "";
}

访问此 ID 不需要任何权限。
您将获得的 ID 是一个 16 字节数组,这个 ID 不仅在所有应用程序上都是相同的,而且对于设备的所有用户也是相同的。因此,来宾帐户也将获得相同的 ID。文章来源地址https://www.toymoban.com/news/detail-501183.html

到了这里,关于Android设备的各种唯一标识符 ID的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】腾讯云服务器(Linux版)如果获取UUID(通用唯一标识符)

    实例元数据包括UUID、实例ID、MAC编号等等,可以通过如下接口查看元数据列表 https://cloud.tencent.com/document/product/213/4934

    2024年02月10日
    浏览(39)
  • HarmonyOS学习路之开发篇—设备管理(设备标识符)

    定义 网络设备节点通信标识符,是分布式软总线提供的一种非永久性标识符。NetworkID基于Java原生的UUID接口随机生成,长度为32字节,使用十六进制表示。主要用于业务调用分布式能力时,标识分布式网络内的设备节点。 NetworkID 举例: 6B97BC8F6F85A2A1A6E0E262111F42D6A8541CBFF6CAF688F

    2024年02月13日
    浏览(61)
  • Xilinx的7系列FPGA中的设备标识符和设备DNA

    图5-16展示了DNA_PORT设计原语的一般功能。在FPGA应用中,首先需要在设计中实例化DNA_PORT原语(如图5-15所示),并用于读取设备DNA。 读取设备DNA的过程如下: 1、转移DNA值 FPGA应用程序必须将DNA值转移到DNA_PORT的输出移位寄存器中。这通常是通过在时钟信号(CLK)的上升沿时断

    2024年04月14日
    浏览(44)
  • 华为---OSPF Router-ID:OSPF路由器标识符(Router Identifier)简介及示例配置---(OSPF Router-ID如何产生?为什么必须在整个路由选择域内保持唯一)

      OSPF Router-ID :路由器标识符(Router Identifier),在OSPF域中唯一地标识一台路由器。         OSPF协议使用Router-ID作为路由器的身份标示,如果在启动这些路由协议时没有指定Router-ID,则路由协议进程可能无法正常启动;在OSPF区域中必须保证Router-ID唯一,不然OSPF无法正确识别

    2024年02月05日
    浏览(41)
  • 错误C2065:未声明的标识符 - 解决C++中的未声明标识符错误

    错误C2065:未声明的标识符 - 解决C++中的未声明标识符错误 在C++编程中,错误C2065是一种常见的编译错误,它表示使用了一个未声明的标识符。通常情况下,这个错误是由于忘记包含必要的头文件或者拼写错误导致的。本文将介绍如何解决这个错误,并提供相应的源代码示例

    2024年02月06日
    浏览(49)
  • 初识标识符

    abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implementis import instanceof int interface long native new package private protected public return strictfp short static super switch synchronized this throw throws transient try void volatile while   java所有的组成

    2024年02月11日
    浏览(59)
  • go学习-指针 标识符

    1.指针 (1).基本介绍 1)基本数据类型,变量存的值,也叫值类型 2)获取变量的地址用,比如 var num int ,获取num的地址:num 3)指针类型,变量存的是一个地址,这个地址指向的空间存的才是真正值,比如: var ptr *int =num 4)获取指针类型所指的值,使用*,比如:var *ptr int,使用

    2024年02月11日
    浏览(49)
  • 解决C++遇到的未定义标识符 “string“、未定义标识符 “cout“、“name”: 未知重写说明符错误

    目录 解决C++遇到的未定义标识符 \\\"string\\\"、未定义标识符 \\\"cout\\\"、“name”: 未知重写说明符错误 1. 未定义标识符 \\\"string\\\" 2. 未定义标识符 \\\"cout\\\" 3. “name”: 未知重写说明符错误 总结 1. 未定义标识符 \\\"string\\\" 2. 未定义标识符 \\\"cout\\\" 3. “name”: 未知重写说明符错误 在C++编程中,我们可

    2024年02月06日
    浏览(95)
  • 第6关:Python的标识符

    2023年04月09日
    浏览(45)
  • C# 标识符命名规则和约定

    目录 命名规则 命名约定 C# 编码约定 命名约定 帕斯卡拼写法 驼峰式大小写 如何使用模式匹配以及 is 和 as 运算符安全地进行强制转换 标识符是分配给类型(类、接口、结构、记录、委托或枚举)、成员、变量或命名空间的名称。 有效标识符必须遵循以下规则: 标识符必须

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包