关于本文档
Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID。例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID。在本文档结尾处提供了作为参考的示例代码片段。
范围
本文提供有关如何读取各种Android设备的ID的介绍,用以使用标识号。本文假定用户已经安装了Android以及开发应用程序必要的工具。并且,本文假定用户已了解Android的基本知识。
简介在搭载Android操作系统的设备中,已经存在好几种类型的设备标识号。先前的所有Android设备都具有电话功能,因此查找每部设备硬件唯一的IMEI,MEID,或ESN也很容易。但仅能使用Wifi的设备或音乐播放器没有电话硬件,所以没有这种类型的唯一标识号。本文阐述了如何读取不同Android设备的标识号。检索Android设备ID各种方式
以下是Android设备不同类型的识别设备ID。
·唯一编号(IMEI,MEID,ESN,IMSI)
·MAC地址
·序列号
·ANDROID_ID
唯一编号(IMEI,MEID,ESN,IMSI)
说明在以前,当Android设备均作为电话使用时,寻找唯一标识号比较简单:()可用于找到(取决于网络技术)手机硬件唯一的IMEI,MEID,ESN和IMSI编号。
TelephonyManager.getDeviceId
IMEI,MEID,ESN,IMSI的定义如下:
•IMEI(国际移动设备识别码)唯一编号,用于识别GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:
•MEID
•ESN
•IMSI
-
importandroid.telephony.TelephonyManager;
-
-
importandroid.content.Context;
-
-
-
-
Stringimeistring=null;
-
-
Stringimsistring=null;
-
-
{
-
-
TelephonyManagertelephonyManager;
-
-
-
-
telephonyManager=
-
-
(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
-
-
-
-
-
-
-
-
-
-
-
-
imeistring=telephonyManager.getDeviceId();
-
-
-
-
-
-
-
-
-
-
-
-
imsistring=telephonyManager.getSubscriberId();
-
-
}
如要只读取手机的状态,则需添加READ_PHONE_STATE许可到AndroidManifest.xml文件中。
-
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
缺点
•Android设备要具有电话功能
•其工作不是很可靠
•序列号
•当其工作时,该值保留了设备的重置信息(“恢复出厂设置”),从而可以消除当客户删除自己设备上的信息,并把设备转另一个人时发生的错误。
Mac地址
说明
可通过检索找到设备的Wi - Fi或蓝牙硬件的Mac地址。但是,不推荐使用Mac地址作为唯一的标识号。
缺点设备要具备Wi – Fi功能(并非所有的设备都有Wi – Fi功能)如果设备目前正在使用Wi
- Fi,则不能报告Mac地址
序列号
从Android 2.3(“姜饼”)开始,通过android.os.Build.SERIAL方法序列号可被使用。没有电话功能的设备也都需要上给出唯一的设备ID;某些手机也可以需要这样做。序列号可以用于识别MID(移动互联网设备)或PMP(便携式媒体播放器),这两种设备都没有电话功能。通过读取系统属性值“ro.serialno”的方法,可以使用序列号作为设备ID。如检索序列号并作为设备ID使用,请参考下面的代码示例。
-
importjava.lang.reflect.Method;
-
-
-
-
Stringserialnum=null;
-
-
try{
-
-
Class<?>c=Class.forName("android.os.SystemProperties");
-
-
Methodget=c.getMethod("get",String.class,String.class);
-
-
serialnum=(String)(get.invoke(c,"ro.serialno","unknown"));
-
-
}
-
-
catch(Exceptionignored)
-
-
{
-
-
}
缺点
序列号无法在所有Android设备上使用。
ANDROID_ID
说明
更具体地说,Settings.Secure.ANDROID_ID 是一串64位的编码(十六进制的字符串),是随机生成的设备的第一个引导,其记录着一个固定值,通过它可以知道设备的寿命(在设备恢复出厂设置后,该值可能会改变)。 ANDROID_ID也可视为作为唯一设备标识号的一个好选择。如要检索用于设备ID 的ANDROID_ID,请参阅下面的示例代码
-
StringandroidId=Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
缺点
•对于Android 2.2(“Froyo”)之前的设备不是100%的可靠
•此外,在主流制造商的畅销手机中至少存在一个众所周知的错误,每一个实例都具有相同的ANDROID_ID。
结论
对于绝大多数应用来说,只需识别特定的安装配置,而不需要识别物理设备。所幸是,这样做就省去了麻烦。
下面是部分使用设备ID的最佳途径:
•支持各种设备类型的另一种方法是使用getDeviceID()API和ro.serialno的组合
•有许多值得参考的原因,来提醒开发者避免试图识别特定的设备。对于那些想做一下这方面尝试的用户,最好的办法可能是使用ANDROID_ID,并在一些传统设备上做尝试。
示例代码
下面是用于追踪Android设置的示例代码
类: ReadDeviceID.java
类: SystemProperties.java
-
packageandroid.os;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicclassSystemProperties
-
-
{
-
-
publicstaticfinalintPROP_NAME_MAX=31;
-
-
publicstaticfinalintPROP_VALUE_MAX=91;
-
-
privatestaticnativeStringnative_get(Stringkey);
-
-
privatestaticnativeStringnative_get(Stringkey,Stringdef);
-
-
privatestaticnativeintnative_get_int(Stringkey,intdef);
-
-
privatestaticnativelongnative_get_long(Stringkey,longdef);
-
-
privatestaticnativebooleannative_get_boolean(Stringkey,booleandef);
-
-
privatestaticnativevoidnative_set(Stringkey,Stringdef);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicstaticStringget(Stringkey){
-
-
if(key.length()>PROP_NAME_MAX){
-
-
thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
-
-
}
-
-
returnnative_get(key);
-
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicstaticStringget(Stringkey,Stringdef){
-
-
if(key.length()>PROP_NAME_MAX){
-
-
thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
-
-
}
-
-
returnnative_get(key,def);
-
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicstaticintgetInt(Stringkey,intdef){
-
-
if(key.length()>PROP_NAME_MAX){
-
-
thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
-
-
}
-
-
returnnative_get_int(key,def);
-
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicstaticlonggetLong(Stringkey,longdef){
-
-
if(key.length()>PROP_NAME_MAX){
-
-
thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
-
-
}
-
-
returnnative_get_long(key,def);
-
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicstaticbooleangetBoolean(Stringkey,booleandef){
-
-
if(key.length()>PROP_NAME_MAX){
-
-
thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
-
-
}
-
-
returnnative_get_boolean(key,def);
-
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicstaticvoidset(Stringkey,Stringval){
-
-
if(key.length()>PROP_NAME_MAX){
-
-
thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
-
-
}
-
-
if(val!=null&&val.length()>PROP_VALUE_MAX){
-
-
thrownewIllegalArgumentException("val.length>"+
-
-
PROP_VALUE_MAX);
-
-
}
-
-
native_set(key,val);
-
-
}
-
-
}
使用"ReadDeviceID" activity 创建"com.deviceid"项目。将布局"main.xml"改写成下面的代码
-
<?xmlversion="1.0"encoding="utf-8"?>
-
-
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
-
android:orientation="vertical"
-
-
android:layout_width="fill_parent"
-
-
android:layout_height="fill_parent"
-
-
>
-
-
<TextView
-
-
android:layout_width="fill_parent"
-
-
android:layout_height="wrap_content"
-
-
android:text="@string/hello"
-
-
/>
-
-
<Button
-
-
android:text="GetDeviceID"
-
-
android:id="@+id/button1"
-
-
android:layout_width="wrap_content"
-
-
android:layout_height="wrap_content">
-
-
</Button>
-
-
<TextView
-
-
android:id="@+id/textView1"
-
-
android:layout_width="fill_parent"
-
-
android:layout_height="wrap_content">
-
-
</TextView>
-
-
</LinearLayout>
在"AndroidManifest.xml"文件中添加"READ_PHONE_STATE"许可,使应用程序可以登陆互联网。
-
<?xmlversion="1.0"encoding="utf-8"?>
-
-
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
-
-
package="com.deviceid"
-
-
android:versionCode="1"
-
-
android:versionName="1.0">
-
-
<uses-sdkandroid:minSdkVersion="7"/>
-
-
-
-
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
-
-
<activityandroid:name=".ReadDeviceID"
-
-
android:label="@string/app_name">
-
-
<intent-filter>
-
-
<actionandroid:name="android.intent.action.MAIN"/>
-
-
<categoryandroid:name="android.intent.category.LAUNCHER"/>
-
-
</intent-filter>
-
-
</activity>
-
-
-
-
</application>
-
-
-
-
<uses-permission
-
-
android:name="android.permission.READ_PHONE_STATE">
-
-
</uses-permission>
-
-
-
-
</manifest>
输出结果
上方示例代码的输出结果如下图所示:
分享到:
相关推荐
欢迎下载《获取Android移动终端设备唯一ID zip》
A tool class that gets the unique ID of the Android device(一个获取Android设备唯一id的工具类)
Android设备获取唯一标识码的方法,可以用
Uinty获取手机端设备唯一id(设备号) 使用说明 1,GetAndroidphoneId.java 这个文件放到Plugins/Android/下 2,AndroidInterface.cs是调用Java的(与java交互) 3,新建脚本->调用 AndroidInterface.GetInstance....
有很多场景和需求你需要用到手机设备的唯一标识符。此案例中,有以下几种方法获取这样的ID。
运行的环境> 2.3.3 或者是android sdk 10
imei是设备的一个编号值,获取比较方便,不过有些设备的设备编号获取不到,这种方式已经没有多少人会采用。下面就讲讲怎么获取imei编号。 UUID生成的原理,先获取设备的标识信息,如果能够获取到就使用该获取到的值...
调用方式:String id = DeviceUtils.getUniqueDeviceId(this);...根据安卓手机设备特征,生成设备唯一设备号。 注意:因为android 6.0以上系统的权限问题可能导致异常,所以要求主项目targetSdkVersion<23
本篇文章主要介绍了详解Android获取设备唯一ID的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源...
Delphi跨平台(Win,Android,IOS)获取设备唯一标识符ios,android,mswindows获取设备唯一标识符和mac地址。
Android10系统权限适配,ANDROID_ID的获取不需要任何权限,并且可以很好地保证唯一性,缺点就是无法保证稳定性,即一些操作可能导致ANDROID_ID的改变。适配Android10系统设备号,已验证ok,欢迎一起探讨。
唯一标识一台Android设备(手机/平板/手表/电视
Android NFC Tag ID 读取
Unity生成设备唯一UUID,代码+样例
用于查看连接Android手机的USB设备的信息,便于后续开发使用!
RedBit.Samples.DeviceId 在 iOS、Android 和 Windows 上获取唯一设备 ID 的 Xamarin Forms 应用程序示例
用于连接多个BLE设备的小Demo,不过只有收数据的功能,没有发数据的功能。注意:请用Android studio打开
当下获得安卓设备唯一标识符近乎完美的方案.Android_id,IMEI,android.os.Build