【转】获取android设备 id
关于本文档
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
[java] view plain copy- importandroid.telephony.TelephonyManager;
- importandroid.content.Context;
- Stringimeistring=null;
- Stringimsistring=null;
- {
- TelephonyManagertelephonyManager;
- telephonyManager=
- (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
- /*
- *getDeviceId()functionReturnstheuniquedeviceID.
- *forexample,theIMEIforGSMandtheMEIDorESNforCDMAphones.
- */
- imeistring=telephonyManager.getDeviceId();
- /*
- *getSubscriberId()functionReturnstheuniquesubscriberID,
- *forexample,theIMSIforaGSMphone.
- */
- imsistring=telephonyManager.getSubscriberId();
- }
如要只读取手机的状态,则需添加READ_PHONE_STATE许可到AndroidManifest.xml文件中。
<uses-permission
android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
缺点
•Android设备要具有电话功能
•其工作不是很可靠
•序列号
•当其工作时,该值保留了设备的重置信息(“恢复出厂设置”),从而可以消除当客户删除自己设备上的信息,并把设备转另一个人时发生的错误。
Mac地址
(1) 调用android 的API: NetworkInterface. getHardwareAddress ()
该API的level为9,只有android 2.3以上才有该接口
(2) 调用java 的方法: nbtstat/arp
一般android不支持这两个命令
(3) 调用Android的API: WifiManager
权限:
1 | <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> |
代码:
1 2 3 4 5 | WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); returninfo.getMacAddress(); |
这个是设备开通Wifi连接,获取到网卡的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使用,请参考下面的代码示例。
[java] view plain copy- <spanstyle="font-size:16px;">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){
- }</span>
缺点
序列号无法在所有Android设备上使用。
ANDROID_ID
说明
更具体地说,Settings.Secure.ANDROID_ID是一串64位的编码(十六进制的字符串),是随机生成的设备的第一个引导,其记录着一个固定值,通过它可以知道设备的寿命(在设备恢复出厂设置后,该值可能会改变)。ANDROID_ID也可视为作为唯一设备标识号的一个好选择。如要检索用于设备ID的ANDROID_ID,请参阅下面的示例代码
String androidId = 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
[java] view plain copy
- <spanxmlns="http://www.w3.org/1999/xhtml"style="font-size:12px;color:#000000;"><strongxmlns="http://www.w3.org/1999/xhtml"><spanxmlns="http://www.w3.org/1999/xhtml"style="">packagecom.deviceid;
- importjava.lang.reflect.Method;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.os.Bundle;
- importandroid.provider.Settings;
- importandroid.telephony.TelephonyManager;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.TextView;
- publicclassReadDeviceIDextendsActivity{
- Buttonbt;
- TextViewidView;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- bt=(Button)findViewById(R.id.button1);
- idView=(TextView)findViewById(R.id.textView1);
- bt.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- Stringimeistring=null;
- Stringimsistring=null;
- TelephonyManagertelephonyManager=
- (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
- /*
- *getDeviceId()functionReturnstheuniquedeviceID.
- *forexample,theIMEIforGSMandtheMEIDorESNforCDMAphones.
- */
- imeistring=telephonyManager.getDeviceId();
- idView.append("IMEINo:"+imeistring+"\n");
- /*
- *getSubscriberId()functionReturnstheuniquesubscriberID,
- *forexample,theIMSIforaGSMphone.
- */
- imsistring=telephonyManager.getSubscriberId();
- idView.append("IMSINo:"+imsistring+"\n");
- /*
- *SystemPropertyro.serialnoreturnstheserialnumberasuniquenumber
- *WorksforAndroid2.3andabove
- */
- StringhwID=android.os.SystemProperties.get("ro.serialno","unknown");
- idView.append("hwID:"+hwID+"\n");
- 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"));
- idView.append("serial:"+serialnum+"\n");
- }catch(Exceptionignored){
- }
- Stringserialnum2=null;
- try{
- Classmyclass=Class.forName("android.os.SystemProperties");
- Method[]methods=myclass.getMethods();
- Object[]params=newObject[]{newString("ro.serialno"),newString("Unknown")};
- serialnum2=(String)(methods[2].invoke(myclass,params));
- idView.append("serial2:"+serialnum2+"\n");
- }catch(Exceptionignored){
- }
- /*
- *Settings.Secure.ANDROID_IDreturnstheuniqueDeviceID
- *WorksforAndroid2.2andabove
- */
- StringandroidId=Settings.Secure.getString(getContentResolver(),
- Settings.Secure.ANDROID_ID);
- idView.append("AndroidID:"+androidId+"\n");
- }
- });
- }
- }</span></strong></span>
类: SystemProperties.java
[java] view plain copy
- packageandroid.os;
- /**
- *Givesaccesstothesystempropertiesstore.Thesystemproperties
- *storecontainsalistofstringkey-valuepairs.
- *
- *{@hide}
- */
- 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);
- /**
- *Getthevalueforthegivenkey.
- *@returnanemptystringifthekeyisn'tfound
- *@throwsIllegalArgumentExceptionifthekeyexceeds32characters
- */
- publicstaticStringget(Stringkey){
- if(key.length()>PROP_NAME_MAX){
- thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
- }
- returnnative_get(key);
- }
- /**
- *Getthevalueforthegivenkey.
- *@returnifthekeyisn'tfound,returndefifitisn'tnull,oranemptystringotherwise
- *@throwsIllegalArgumentExceptionifthekeyexceeds32characters
- */
- publicstaticStringget(Stringkey,Stringdef){
- if(key.length()>PROP_NAME_MAX){
- thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
- }
- returnnative_get(key,def);
- }
- /**
- *Getthevalueforthegivenkey,andreturnasaninteger.
- *@paramkeythekeytolookup
- *@paramdefadefaultvaluetoreturn
- *@returnthekeyparsedasaninteger,ordefifthekeyisn'tfoundor
- *cannotbeparsed
- *@throwsIllegalArgumentExceptionifthekeyexceeds32characters
- */
- publicstaticintgetInt(Stringkey,intdef){
- if(key.length()>PROP_NAME_MAX){
- thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
- }
- returnnative_get_int(key,def);
- }
- /**
- *Getthevalueforthegivenkey,andreturnasalong.
- *@paramkeythekeytolookup
- *@paramdefadefaultvaluetoreturn
- *@returnthekeyparsedasalong,ordefifthekeyisn'tfoundor
- *cannotbeparsed
- *@throwsIllegalArgumentExceptionifthekeyexceeds32characters
- */
- publicstaticlonggetLong(Stringkey,longdef){
- if(key.length()>PROP_NAME_MAX){
- thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
- }
- returnnative_get_long(key,def);
- }
- /**
- *Getthevalueforthegivenkey,returnedasaboolean.
- *Values'n','no','0','false'or'off'areconsideredfalse.
- *Values'y','yes','1','true'or'on'areconsideredtrue.
- *(caseinsensitive).
- *Ifthekeydoesnotexist,orhasanyothervalue,thenthedefault
- *resultisreturned.
- *@paramkeythekeytolookup
- *@paramdefadefaultvaluetoreturn
- *@returnthekeyparsedasaboolean,ordefifthekeyisn'tfoundoris
- *notabletobeparsedasaboolean.
- *@throwsIllegalArgumentExceptionifthekeyexceeds32characters
- */
- publicstaticbooleangetBoolean(Stringkey,booleandef){
- if(key.length()>PROP_NAME_MAX){
- thrownewIllegalArgumentException("key.length>"+PROP_NAME_MAX);
- }
- returnnative_get_boolean(key,def);
- }
- /**
- *Setthevalueforthegivenkey.
- *@throwsIllegalArgumentExceptionifthekeyexceeds32characters
- *@throwsIllegalArgumentExceptionifthevalueexceeds92characters
- */
- 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"改写成下面的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns: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"许可,使应用程序可以登陆互联网。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.deviceid"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ReadDeviceID"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission
android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
</manifest>
输出结果
上方示例代码的输出结果如下图所示:
原文: http://samsungapps.csdn.net/text.html?arcid=304625
还可以参考:http://www.byywee.com/page/M0/S613/613551.html
更多相关文章
- Android沉浸式效果的实现—Sofia的使用
- 想抢先体验Android操作系统的魅力吗?那就使用Android(安卓)LiveCD
- 如何检索Android设备的唯一ID
- 快速的APK厂商快速和免费的Android应用软件,而无需编码技巧
- 想抢先体验Android操作系统的魅力吗?那就使用Android(安卓)LiveCD
- Android之简单了解Android(安卓)OS内部机制
- 箭头函数的基础使用
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用