获取Android设备的唯一 Android ID
2016-04-08 17:57
645 查看
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。
参考:http://articles.csdn.net/badasanxingzhuanqu/jishuwenzhang_Android/2011/0919/304625.html
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如何检索Android设备的唯一ID
时间:2011-09-19 14:38来源:未知 作者:张京晶 点击:32317次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.getDeviceIdIMEI,MEID,ESN,IMSI的定义如下:•IMEI(国际移动设备识别码)唯一编号,用于识别 GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:•MEID•ESN•IMSIimportandroid.telephony.TelephonyManager; importandroid.content.Context; String imeistring = null; String imsistring = null; { TelephonyManager telephonyManager; telephonyManager = ( TelephonyManager)getSystemService( Context.TELEPHONY_SERVICE ); /* * getDeviceId() function Returnsthe unique device ID. * for example,theIMEI for GSM and the MEID or ESN for CDMA phones. */ imeistring = telephonyManager.getDeviceId(); /* * getSubscriberId() function Returnsthe unique subscriber ID, * for example,the IMSI for a GSM phone. */ imsistring = telephonyManager.getSubscriberId(); }如要只读取手机的状态,则需添加READ_PHONE_STATE许可到AndroidManifest.xml文件中。<uses-permission android:name="android.permission.READ_PHONE_STATE" ></uses-permission>缺点•Android设备要具有电话功能•其工作不是很可靠•序列号•当其工作时,该值保留了设备的重置信息(“恢复出厂设置”),从而可以消除当客户删除自己设备上的信息,并把设备转另一个人时发生的错误。Mac地址说明可通过检索找到设备的Wi- Fi或蓝牙硬件的Mac地址。但是,不推荐使用Mac地址作为唯一的标识号。缺点设备要具备Wi– Fi功能(并非所有的设备都有Wi – Fi功能)如果设备目前正在使用Wi- Fi,则不能报告Mac地址序列号从Android2.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(Exception ignored) { } 缺点序列号无法在所有Android设备上使用。ANDROID_ID 说明更具体地说,Settings.Secure.ANDROID_ID 是一串64位的编码(十六进制的字符串),是随机生成的设备的第一个引导,其记录着一个固定值,通过它可以知道设备的寿命(在设备恢复出厂设置后,该值可能会改变)。 ANDROID_ID也可视为作为唯一设备标识号的一个好选择。如要检索用于设备ID 的ANDROID_ID,请参阅下面的示例代码StringandroidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID); 缺点• 对于Android2.2(“Froyo”)之前的设备不是100%的可靠• 此外,在主流制造商的畅销手机中至少存在一个众所周知的错误,每一个实例都具有相同的ANDROID_ID。 结论对于绝大多数应用来说,只需识别特定的安装配置,而不需要识别物理设备。所幸是,这样做就省去了麻烦。下面是部分使用设备ID的最佳途径:•支持各种设备类型的另一种方法是使用getDeviceID()API和ro.serialno的组合•有许多值得参考的原因,来提醒开发者避免试图识别特定的设备。对于那些想做一下这方面尝试的用户, 最好的办法可能是使用ANDROID_ID,并在一些传统设备上做尝试。示例代码下面是用于追踪Android设置的示例代码类:ReadDeviceID.javapackage com.deviceid; importjava.lang.reflect.Method; importandroid.app.Activity;import android.content.Context;importandroid.os.Bundle;import android.provider.Settings;importandroid.telephony.TelephonyManager;importandroid.view.View;import android.view.View.OnClickListener;importandroid.widget.Button;import android.widget.TextView; publicclass ReadDeviceID extends Activity { Buttonbt; TextView idView; /** Called when the activity is first created. */ @Override public void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bt=(Button)findViewById(R.id.button1); idView=(TextView)findViewById(R.id.textView1); bt.setOnClickListener(new OnClickListener() { @Override publicvoid onClick(View v) { String imeistring=null; String imsistring=null; TelephonyManager telephonyManager = ( TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE ); /* * getDeviceId() function Returns theunique device ID. * for example,the IMEIfor GSM and the MEID or ESN for CDMA phones. */ imeistring= telephonyManager.getDeviceId(); idView.append("IMEI No : "+imeistring+"\n"); /* * getSubscriberId() function Returns the unique subscriber ID, * for example, the IMSI for a GSM phone. */ imsistring = telephonyManager.getSubscriberId(); idView.append("IMSI No : "+imsistring+"\n"); /* * System Property ro.serialno returns the serial number as unique number * Worksfor Android 2.3 and above */ String hwID = android.os.SystemProperties.get("ro.serialno", "unknown"); idView.append( "hwID : " + hwID + "\n" ); String serialnum = null; try { Class<?> c = Class.forName("android.os.SystemProperties"); Method get = c.getMethod("get", String.class, String.class ); serialnum = (String)( get.invoke(c, "ro.serialno", "unknown" ) ); idView.append( "serial : " + serialnum + "\n" ); } catch (Exception ignored) { } String serialnum2 = null; try { Class myclass = Class.forName( "android.os.SystemProperties" ); Method[]methods = myclass.getMethods(); Object[] params = new Object[] { new String( "ro.serialno" ) , new String( "Unknown" ) }; serialnum2 = (String)(methods[2].invoke( myclass, params )); idView.append( "serial2 : " + serialnum2 + "\n" ); }catch (Exception ignored) { } /* * Settings.Secure.ANDROID_ID returns the unique DeviceID * Works for Android 2.2 and above */ String androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); idView.append( "AndroidID : " + androidId + "\n" ); } }); }} 类:SystemProperties.java packageandroid.os; /** *Gives access to the system properties store. The system properties *store contains a list of string key-value pairs. * *{@hide} */publicclass SystemProperties{ public static final int PROP_NAME_MAX = 31; public static final int PROP_VALUE_MAX = 91; private static native String native_get(String key); private static native String native_get(String key, String def); private static native int native_get_int(String key, int def); private static native long native_get_long(String key, long def); private static native boolean native_get_boolean(String key, boolean def); private static native void native_set(String key, String def); /** * Get the value for the given key. * @return an empty string if the key isn't found * @throws IllegalArgumentException if the key exceeds 32 characters */ public static String get(String key){ if (key.length() > PROP_NAME_MAX){ throw new IllegalArgumentException("key.length> " + PROP_NAME_MAX); } return native_get(key); } /** * Get the value for the given key. * @return if the key isn't found, return def if it isn't null, or an empty string otherwise * @throws IllegalArgumentException if the key exceeds 32 characters */ public static String get(String key,String def) { if (key.length() >PROP_NAME_MAX) { throw new IllegalArgumentException("key.length> " + PROP_NAME_MAX); } return native_get(key, def); } /** * Get the value for the given key,and return as an integer. * @paramkey the key to lookup * @param defa default value to return * @returnthe key parsed as an integer, or def if the key isn't found or * cannot be parsed * @throwsIllegalArgumentException if the key exceeds 32 characters */ public static int getInt(String key,int def) { if (key.length() > PROP_NAME_MAX){ throw new IllegalArgumentException("key.length> " + PROP_NAME_MAX); } return native_get_int(key, def); } /** * Get the value for the given key,and return as a long. * @param keythe key to lookup * @param def a defaultvalue to return * @return the key parsedas a long, or def if the key isn't found or * cannot be parsed * @throwsIllegalArgumentException if the key exceeds 32 characters */ public static long getLong(Stringkey, long def) { if (key.length()> PROP_NAME_MAX) { throw newIllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get_long(key, def); } /** * Get the value for the given key,returned as a boolean. * Values 'n','no', '0', 'false' or 'off' are considered false. * Values 'y', 'yes', '1', 'true' or 'on' are considered true. * (case insensitive). * If the keydoes not exist, or has any other value, then the default * result is returned. * @param keythe key to lookup * @param def a defaultvalue to return * @return the key parsedas a boolean, or def if the key isn't found or is * not able to be parsed as a boolean. * @throws IllegalArgumentException if the key exceeds 32 characters */ public static boolean getBoolean(Stringkey, boolean def) { if (key.length()> PROP_NAME_MAX) { throw newIllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get_boolean(key,def); } /** * Set the value for the given key. * @throws IllegalArgumentException if the key exceeds 32 characters * @throws IllegalArgumentException if the value exceeds 92 characters */ public static void set(String key,String val) { if (key.length() >PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } if (val != null && val.length() > PROP_VALUE_MAX) { throw new IllegalArgumentException("val.length> " + PROP_VALUE_MAX); } native_set(key, val); }}使用"ReadDeviceID" activity 创建"com.deviceid"项目。将布局"main.xml"改写成下面的代码<?xmlversion="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"许可,使应用程序可以登陆互联网。<?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" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ReadDeviceID" android:label="@string/app_name"> <intent-filter> <actionandroid: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> 输出结果上方示例代码的输出结果如下图所示: |
相关文章推荐
- Android4.3 蓝牙BLE初步
- Android安全攻防战,反编译与混淆技术完全解析(上)
- 解决android控件事件冲突
- Android开发请求网络方式详解
- Android 字体设置-Typeface讲解
- Android客户端和服务器数据交互
- 计算缓存大小并且清空缓存 && Android存储访问及目录
- Android Studio---Error:(18, 0) Gradle DSL method not found: 'android()'
- Android 自定义加载中
- Android中的windowSoftInputMode属性详解
- Android —— 实现推送方式解决方案
- Android Studio插件GsonFormat快速实现JavaBean
- android组件之DrawerLayout(抽屉导航)-- 侧滑菜单效果
- 关于在android程序执行过程中使用Intent启动另一个活动后,同个方法未执行的代码是否会继续执行。
- android中关于文件解码时出现乱码的相关分析
- Android上传图片之调用系统拍照和从相册选择图片
- Android 恢复Activity现场
- Android Studio老是出现Cannot reload AVD list: for input string: ""这个错误
- Android MediaPlayer实现音乐播放
- Android线程优先级规定及其设置的具体方法