`
艳过留痕
  • 浏览: 40232 次
社区版块
存档分类

手机设备的唯一标识符

 
阅读更多

有很多场景和需求你需要用到手机设备的唯一标识符。例如,略。
Android中,有以下几种方法获取这样的ID。

1. The IMEI: 仅仅只对Android手机有效:

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

采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是唯一的,它应该类似于 359881030314356(除非你有一个没有量产的手机(水货)它可能有无效的IMEI,如:0000000000000)。

2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得唯一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是唯一的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:

String m_szDevIDShort = "35" + //we make this look like a valid IMEI 

Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits  

大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。

3. The Android ID  , 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。

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

Returns: 9774d56d682e549c . 无需任何许可。

4. The WLAN MAC Address string, 是另一个唯一ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。

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

Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。

5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.

BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter      
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();      
String m_szBTMAC = m_BluetoothAdapter.getAddress();

Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。

Combined Device ID
综上所述,我们一共有五种方式取得设备的唯一标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,最好的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。

String m_szLongID = m_szImei + m_szDevIDShort 
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// compute md5
MessageDigest m =null;
try{
 m =MessageDigest.getInstance("MD5");
 }catch(NoSuchAlgorithmException e){
 e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[]= m.digest();
// create a hex string
String m_szUniqueID =newString();
for(int i=0;i<p_md5Data.length;i++){
int b =(0xFF& p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding)
if(b <=0xF)
        m_szUniqueID+="0";
// add number to string
    m_szUniqueID+=Integer.toHexString(b);
}// hex string to uppercase
m_szUniqueID = m_szUniqueID.toUpperCase();

通过以上算法,可产生32位的16进制数据:
9DDDF85AFF0A87974CE4541BD94D5F55
现在你就可以对其进行你的应用了。

分享到:
评论

相关推荐

    Delphi跨平台(Win,Android,IOS)获取设备唯一标识符

    首先,我们需要了解在不同平台上设备唯一标识符的概念: 1. iOS:在iOS系统中,通常使用UDID(Unique Device Identifier)作为设备的唯一标识。然而,由于隐私保护政策的改变,自iOS 6开始,Apple不再提供UDID。...

    获取设备唯一标识符UUID

    总结,获取设备唯一标识符UUID在iOS开发中扮演着重要角色,特别是在需要长期跟踪用户但又尊重其隐私的情况下。通过使用KeyChain来存储UUID,我们可以确保这些信息的安全性,同时遵循Apple的隐私政策。了解并熟练掌握...

    Android生成唯一标识符UUID(完全替代IMEI)

    本文将深入探讨如何在Android中生成UUID以及其作为唯一标识符的优势。 UUID(Universally Unique Identifier)是一种全球唯一的标识符,它是由128位数字组成的。在Android中,我们可以使用Java的`java.util.UUID`类...

    ios开发获取手机唯一标识符和调用系统打电话拨号功能

    在iOS开发中,获取手机的唯一标识符以及调用系统打电话拨号功能是常见的需求,尤其是在需要用户身份识别或者提供电话服务的应用中。下面将详细讲解这两个知识点。 首先,我们来探讨如何在iOS中获取手机的唯一标识符...

    Uinty获取手机端设备唯一id(设备号)GetAndroidphoneId.zip

    Uinty获取手机端设备唯一id(设备号) 使用说明 1,GetAndroidphoneId.java 这个文件放到Plugins/Android/下 2,AndroidInterface.cs是调用Java的(与java交互) 3,新建脚本-&gt;调用 AndroidInterface.GetInstance....

    获取设备唯一标识的例子

    如果需要获取更稳定的设备唯一标识,可以尝试使用`CFUUIDCreate`函数创建一个UUID(通用唯一标识符),并保存到Keychain中,这样可以在应用的生命周期内保持一致。然而,苹果自iOS 7开始限制了获取IMEI和UDID(唯一...

    Android2Unity.zip

    在Android和Unity集成开发中,获取设备唯一标识符是一个常见的需求,这有助于追踪用户行为、实现个性化服务或进行设备安全验证。"Android2Unity.zip"压缩包提供的资源可能是一个解决方案,将Android系统的设备标识符...

    获取手机唯一标识

    这个ID允许用户控制是否共享他们的广告活动,因此不适合用作设备唯一标识。 5. **UUID(Universally Unique Identifier)** 开发者也可以自定义生成一个UUID,存储在 SharedPreferences 或数据库中。当用户卸载再...

    Unity安卓生成设备唯一UUID

    Unity生成设备唯一UUID,代码+样例

    Android手机唯一标识

    然而,Android系统并没有提供一个内置的、始终不变的唯一标识符,因为考虑到用户隐私和安全问题。"Android手机唯一标识"这个话题涉及到如何在Android系统中组合不同的标识来尽可能地创建一个独一无二的标识符。 1. ...

    获取移动设备唯一标识

    1. **UDID**(Unique Device Identifier):过去,iOS设备的UDID是一个40位的唯一标识符,但自iOS 5.1后,苹果不再推荐使用UDID,并在iOS 7中完全禁止了对外暴露UDID的API。 2. **identifierForVendor (IDFV)**:...

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

    然而,随着Android系统的更新,为了保护用户隐私,获取设备唯一标识的方式也在不断变化。本篇文章将深入探讨几种常见的Android设备获取唯一标识码的方法。 1. **IMEI(国际移动设备识别码)** IMEI是手机硬件的全球...

    ppc 获取手机设备唯一标识码(c#)

    在IT行业中,尤其是在移动开发领域,获取设备唯一标识码是一个常见的需求。这通常用于区分不同的设备,以便进行个性化设置、数据分析或用户身份验证。本文将深入探讨如何在C#环境下,针对PPC(Pocket PC)设备获取其...

    获取Android移动终端设备唯一ID.zip

    本资料"获取Android移动终端设备唯一ID.zip"聚焦于这一主题,旨在帮助开发者了解如何在Android平台上获取设备的唯一识别码。 在Android系统中,有几种方式可以获取到设备的唯一标识: 1. **IMEI(国际移动设备识别...

    安卓设备唯一标识解决方案

    本文将详细探讨“安卓设备唯一标识解决方案”,包括国内手机厂商的开放匿名标识(OAID)、海外手机平台的安卓广告标识(AAID)以及AndroidID和GUID等常见设备标识的获取与应用。 首先,我们来了解国内的OAID(Open ...

    Android 使用html5得到手机设备信息

    PhoneGap是一个开源框架,它封装了JavaScript接口,使得开发者可以通过JavaScript调用Android的API,比如获取设备的唯一标识符、电池状态、网络类型等。 在提供的压缩包文件中,"JavaApk源码说明.txt"可能包含了...

    Android-一个获取Android设备唯一id的工具类

    1. `DeviceIDUtils.java`:工具类的源代码,包含了获取设备唯一ID的核心逻辑。 2. `README.md`:介绍如何使用这个工具类,包括导入库、调用方法等步骤。 3. `LICENSE`:开源许可证文件,规定了代码的使用权限和条件...

    PDA唯一码(windows CE)

    Console.WriteLine("设备唯一标识符: " + deviceId.ToString()); } } ``` 这段代码通过`DeviceInformation`类的`DeviceId`属性获取了设备的GUID,并将其打印出来。这个标识符可以用于区分不同的PDA设备。 在...

    iOS 获取设备唯一标示符的方法详解

    iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。好景不长,因为该唯一标识符与手机一一对应,苹果...

    安卓登录注册相关-唯一标识一台Android设备手机平板手表电视.rar

    不过,IMEI在非手机设备(如平板、手表、电视)上可能不可用。 2. **Android ID**:这是一个16进制的字符串,表示设备的软件实例。每个新安装的系统都会生成一个新的Android ID,因此在设备恢复出厂设置后,Android...

Global site tag (gtag.js) - Google Analytics