Android篇

1 IMEI和MEID

(1) IMEI

(International Mobile Equipment Identity) 是国际移动设备身份码的缩写,国际移动装备辨识码,只有Android手机才获取的到,是由15位数字组成的"电子串号",比如像这样 359881030314356,它与每台移动电话机一一对应,而且该码是全世界唯一的。

它是GSM设备返回的,并且是写在主板上的,重装APP不会改变IMEI。

2.MEID

(Mobile Equipment Identifier) 移动设备识别码是CDMA手机的身份识别码,也是每台CDMA手机或通讯平板唯一的识别码。

小结

IMEI是联通、移动手机的标识,MEID是电信手机的标识

3.如何获取IMEI和MEID

加权限

<!-- 允许程序读写手机状态和身份 -->

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

java代码

//实例化TelephonyManager对象TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);Method method = telephonyManager.getClass().getMethod("getDeviceId", int.class);//获取IMEI号String imei1 = manager.getDeviceId();String imei2 = (String) method.invoke(manager, 1);//获取MEID号String meid = (String) method.invoke(telephonyManager, 2);某些没有电话功能的平板是获取不到IMEI和IMSI号的。且在某些设备上getDeviceId()会返回垃圾数据Android Q(10)版本之后禁止使用2 DeviceId又叫设备ID。可以用系统提供的TelephonyManager服务来获取,具有唯一性。其中又包括IMEI 和 MEID/ESN。一般情况我们获取手机的DeviceId也就是手机的IMEI码private String getDeviceId() {TelephonyManager tm = (TelephonyManager) getContext().getSystemService(Service.TELEPHONY_SERVICE);return tm.getDeviceId();}一个双卡手机不止一个IMEI值,全网通双卡手机有两个IMEI和一个MEIDAndroid Q(10)版本之后禁止使用网上有个通过硬件信息拼凑出来的15位号码的方法public static String getDeviceId(){String serial = null;String m_szDevIDShort = "35" +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 位try{if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){serial = android.os.Build.getSerial();}else{serial = Build.SERIAL;}//API>=9 使用serial号return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();}catch (Exception exception){//serial需要一个初始化serial = "serial"; // 随便一个初始化}//使用硬件信息拼凑出来的15位号码return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();}3 mac地址硬件标识符,包括WiFi mac地址和蓝牙mac地址。WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);WifiInfowifiInfo=wifiManager.getConnectionInfo();String mac=wifiInfo.getMacAddress();在Android 6.0系统上,这个方法失效了,返回 “02:00:00:00:00:00” 的常量,并被判定为有害应用另,使用Android模拟器可以很方便的修改mac地址:4 ANDROID_IDANDROID_ID是设备首次启动时由系统随机生成的一串64位的十六进制数字String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);1ANDROID_ID缺点:①.设备刷机wipe数据或恢复出厂设置时ANDROID_ID值会被重置。②.现在网上已有修改设备ANDROID_ID值的APP应用。③.某些厂商定制的系统可能会导致不同的设备产生相同的ANDROID_ID。④.某些厂商定制的系统可能导致设备返回ANDROID_ID值为空。⑤.CDMA设备,ANDROID_ID和DeviceId返回的值相同5 UUID(Universally Unique Identifier) 通用唯一识别码,APP重装后会改变。6 OpenUDID(Open Unique Device Identifier) 设备唯一标识符。APP重装,值也不变,除非root手机(普通用户做不到)在AndroidManifest.xml中添加<service android:name=”org.openudid.OpenUDID_service”><intent-filter><action android:name=”org.openudid.GETUDID” /></intent-filter></service>获取OpenUDID的方法public class UDID{public static UDID getInstance(){return new UDID();}public String getUDID(Context context){String UDID = "";OpenUDID_manager.sync(context);boolean isInitialized = OpenUDID_manager.isInitialized();if (isInitialized){UDID = "Android"+ OpenUDID_manager.getOpenUDID();}return UDID;}}另一个通过DeviceId、ANDROID_ID和uuid来构造UDID的方法protected static String uuid;/*** 获取唯一标识码* 1、正常情况下可以通过((TelephonyManager) s_instance.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();  来获取,但是某些平板电脑此函数会返回空* 2、通过 Secure.getString(s_instance.getContentResolver(), Secure.ANDROID_ID);   也可以获取到一个id,但是android2.2或者是某些山寨手机使用这个也是有问题的,它会返回一个固定的值 9774d56d682e549c* 3、如果前两个都没有获取到udid,那么就在程序启动的时候创建一个随机的uuid,然后保存起来。这个算是兼容方案,当然这样的设备并不会很多。*/public synchronized static String getUDID(Context mContext){if( uuid ==null ){if( uuid == null){final SharedPreferences prefs = mContext.getApplicationContext().getSharedPreferences( PREFS_FILE, Context.MODE_PRIVATE);final String id = prefs.getString(PREFS_DEVICE_ID, null );if (id != null){// Use the ids previously computed and stored in the prefs fileuuid = id;}else{final String androidId = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID);// Use the Android ID unless it's broken, in which case fallback on deviceId,// unless it's not available, then fallback on a random number which we store// to a prefs filetry{if (!"9774d56d682e549c".equals(androidId)){uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")).toString();}else{final String deviceId = ((TelephonyManager) mContext.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString();}}catch (UnsupportedEncodingException e){throw new RuntimeException(e);}// Write the value out to the prefs fileprefs.edit().putString(PREFS_DEVICE_ID, uuid).commit();}}}return uuid;}7 Serial Number设备序列号。获取办法:String serialNum = android.os.Build.SERIAL;1装有SIM卡的设备获取办法:getSystemService(Context.TELEPHONY_SERVIEC).getSimSerialNumber();1注意对CDMA设备,返回的是一个空值。在Android 2.3可以通过android.os.Build.SERIAL获取,非手机设备可以通过该接口获取。在少数的一些设备上,会返回垃圾数据。对于没有通话功能的设备,它可能会返回一个固定的值。8 IDFA2014年Android2.3基于Google Play推出了IDFA,功能同IOS的IDFA一样,允许用户重置或禁用该ID,由用户决定是否愿意被追踪。但是在中国发行的国行手机由于某些原因,google地图、Play等基础App被阉割掉了,这样导致在中国国行手机中都获取不到该IDFA。(除非用户自行Root并安装google Play)9 GAID在装了google play service的安卓手机上,才可以获取到GAID广告id是用户特殊的,独特的,可重置的广告id,由Google Play Service提供,它为用户更好的控制,为开发人员提供简单、标准的系统继续使用你的应用程序,它用于广告目的的匿名标示符和或者重置起标示符或者退出以利益为基础的Google Play的医用程序。广告ID可以通过简单的API在你的应用程序中实现。(1) 获取Google Play Service SDK从下载好的Android SDK的 Extras目录下找 library 下面的google-play-service.jar(2) 接口广告ID的API可在com.google.android.gms.ads.identifier包在Google Play Service的的库中。获得用户的广告ID和跟踪偏好,调用方法getadvertisingidinfo(),它返回一个advertisingidclient信息封装。用户当前的广告ID和跟踪偏好。例import com.google.android.gms.ads.identifier.AdvertisingIdClient;import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;import com.google.android.gms.common.GooglePlayServicesAvailabilityException;import com.google.android.gms.common.GooglePlayServicesNotAvailableException;import java.io.IOException;// Do not call this function from the main thread. Otherwise,// an IllegalStateException will be thrown.public void getIdThread(){Info adInfo = null;try{adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);}catch(IOException e){// Unrecoverable error connecting to Google Play services (e.g.,// the old version of the service doesn't support getting AdvertisingId).}catch(GooglePlayServicesAvailabilityException e){// Encountered a recoverable error connecting to Google Play services.}catch(GooglePlayServicesNotAvailableException e){// Google Play services is not available entirely.}final String id = adInfo.getId();final boolean isLAT = adInfo.isLimitAdTrackingEnabled();}iOS篇1 IMEIiOS 5 之后被禁止。写在主板上,重装APP不会改变。示例:3517100588808642 IDFA广告标示符,于iOS 6 时面世,在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,同时保证用户设备不被APP追踪的折中方案。可能发生变化,如系统重置、在设置里还原广告标识符。用户可以在设置里打开“限制广告跟踪”。#import <AdSupport/AdSupport.h>NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];12有几种情况下,会重新生成广告标示符:(1) 如果用户完全重置系统(设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。(2) 另外如果用户明确的还原广告 (设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。示例:1E2DFA89-496A-47FD-9941-DF1FC4E6484A3 mac地址硬件标识符,包括WiFi mac地址和蓝牙mac地址。iOS 7 之后被禁止(同时禁止的还有OpenUDID)。4 UDID用来标示设备的唯一性 。iOS 6 之后被禁止获取系统原生的UDID,但可以通过uuid,写入到钥匙串中,从而获得自定义的UDID(非系统原生),即使用户重装APP,只要每次都取这个钥匙串返回,就是不变的。//UUID , 已废除NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

4.为什么苹果反对开发人员使用UDID

许多开发者把UDID跟用户的真实姓名、密码、住址、其它数据关联起来;网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据。同时大部分应用确实在频繁传输UDID和私人信息。 为了避免集体诉讼,苹果最终决定在iOS 5 的时候,将这一惯例废除,开发者被引导生成一个唯一的标识符,只能检测应用程序,其他的信息不提供。现在应用试图获取UDID已被禁止且不允许上架。

苹果公司建议使用UUID为应用生成唯一标识字符串。

获得的UUID值系统没有存储, 而且每次调用得到UUID,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

5 UUID

APP重装后会改变。

6 如何正确的获取设备的唯一标识

将获取的UUID永久存储在设备的KeyChain中,这个方法在应用第一次启动时,将获取的UUID存储进KeyChain中,每次取的时候,检查本地钥匙串中有没有,如果没有则需要将获取的UUID存储进去。当你重启设备,卸载应用再次安装,都不影响,只是当设备刷机时,KeyChain会清空,才会消失,才会失效。

7 什么是钥匙串

在应用间利用KeyChain共享数据

我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见。而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法是新建一个plist文件,名字随便起,内容如下

“yourAppID.com.yourCompany.whatever”就是你要起的公共区名称,除了whatever字段可以随便定之外,其他的都必须如实填写。这个文件的路径要配置在 Project->build setting->Code Signing Entitlements里,否则公共区无效,配置好后,须用你正式的证书签名编译才可通过,否则xcode会弹框告诉你code signing有问题。所以,苹果限制了你只能同公司的产品共享KeyChain数据,别的公司访问不了你公司产品的KeyChain。

2022最新手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)教程相关推荐

  1. 手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)

    文章目录 Android篇 1 IMEI和MEID 2 DeviceId 3 mac地址 4 ANDROID_ID 5 UUID 6 OpenUDID 7 Serial Number 8 IDFA 9 ...

  2. 移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID的名词解释

    一.最兼容的设备识码 二.名词释义     2.1 Device ID     2.2 IMEI     2.3 IDFA     2.4 UDID     2.5 UUID 三.设备标识码详解   ...

  3. android绑定手机设备,浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID

    场景 : 客户提出一个问题就是把用户的登录记录和设备绑定到一起,就是每个人都是固定的设备(可能是安全因素吧). 一开始想的是回去设备的IMEI号和用户账号绑定起来,结果发现IMEI不对外开发,只能另寻 ...

  4. 移动端设备标识码/设备唯一标识码/设备唯一性

    文章目录 名词释义 Android 设备标识码 iOS设备标识码 总结 名词释义 Device ID:设备ID. IMEI:International Mobile Equipment Identit ...

  5. 2022最新android设备uuid、udid使用教程​

    前言​ udid:​ UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识.​ uuid:​ UUID是Universally Unique Identifier的 ...

  6. 获取手机设备的IMSI / IMEI 信息

    IMSI 全称为 International Mobile Subscriber Identity,中文翻译为国际移动用户识别码.它是在公众陆地移动电话网(PLMN)中用于唯一识别移动用户的一个号码. ...

  7. 移动设备标识码简单总结

    做数据产品知识储备,到处搜的资料整理的,比较碎就没有放引用链接了,欢迎指正. 一.安卓设备 名称 说明 格式 获取方式 应用 IMEI 国际移动设备识别码(International Mobile E ...

  8. Android获取手机设备识别码(IMEI)和手机号码

    最近看了下获取手机设备ID和手机信息以及SIM的信息例子,主要还是借鉴别人的,现在自己写一下,算是巩固加深了,也希望能给大家一个参考 必要的条件还是一部真机,SIM卡或者UIM卡. 首先,在Andro ...

  9. 2022最新oneNav导航系统源码全开源版本下载总裁导航

    介绍 2022最新导航系统源码全开源版本下载 导航系统2022最新开源版,所有文件均已开源,用户可自行更改二开,没有授权代码 没有后门 用户可自行D盾扫描,响应式布局,支持搜索框弹窗,支持暗夜模式,文 ...

  10. 2013最新手机QQ源码源码下载

    分享一款我刚刚在网上找到的一款很完整的高仿手机qq源码,不但有服务端,而且还有客户端源码,喜欢的朋友可以下载学习看看. 源码下载: http://code.662p.com/view/qq.html

最新文章

  1. 图灵2010.01书讯——看你错过了哪一本
  2. python 统计单词个数---不去重
  3. 微信公众平台入门开发教程.Net(C#)框架
  4. NSURLProtocol 拦截 NSURLSession 请求时body丢失问题解决方案探讨
  5. Ubuntu 系统安装APACHE PHP MYSQL
  6. ES6——Symbol
  7. Class com.fasterxml.jackson.databind.ser.BasicSerializerFactory can not access a member of class com
  8. 第四季-专题13-总线设备驱动模型
  9. 企业如何从CMMI3升级为CMMI5,有哪些优势?
  10. sqlsever2012评估期已过
  11. alize blue_泽野弘之 | 明明可以靠才华,却非要用脸滚键盘的神曲缔造者
  12. Python模拟简易版淘宝客服机器人
  13. 实战--接入最坑的支付宝
  14. openMSP430 介绍
  15. Excel中换行的问题
  16. windows7操作系统安装步骤(精简版)
  17. Cesium 开启场景FPS显示
  18. Python修改图片像素值(变彩色为黑白)
  19. 三维地图代码 echarts demo
  20. 腾讯地图微信小程序JavaScript SDK

热门文章

  1. Java中StringBuffer类的常用方法
  2. jde中文名杰德爱华兹(中国)软件系统有限公司
  3. Pandavan LED Document
  4. visio机柜设备图标_弱电各个设备安装设计大样图,可编辑!(CAD版本)
  5. 手机chrome扫描二维码_90%的用户都不知道这项Chrome隐藏功能如何开启,超级实用!...
  6. JAVA项目案例模板,仅供参考怎么写
  7. bp神经网络预测模型流程图,bp神经网络实例分析
  8. H2080刷卡门禁一体机使用说明书 誉诚AD281A-T楼宇主机说明书
  9. STM32固件库的下载
  10. 编译原理第三版课后习题