Android设备标识-没有完美的解决方案-只有取舍

本文链接    http://blog.csdn.net/xiaodongrush/article/details/28864845

1.  几种常用的设备标识码

IMEI,Sim卡序列号,Wifi模块Mac地址,Android_ID

TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String imei = telephonyManager.getDeviceId();
String simNo = telephonyManager.getSimSerialNumber();
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
String wifiAddress = wm.getConnectionInfo().getMacAddress();
String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

IMEI是可以用软件直接改写的,重复是无法避免的,标准是15位数字,有些设备上,连这个标准都保证不了。IMEI与每台手机对应,PAD没有IMEI。此外,小米2上发现,如果不信任一个APP,那么这个APP将读取不到IMEI,即读到的结果是null。IMEI是有多么的不靠谱。

PAD没有Sim卡,自然也没有Sim卡序列号,双卡的手机还会有两个Sim卡序列号。PAD也麻烦的,没有IMEI,没有SIM卡序列号。

某些手机或者设备没有Wifi模块,Mac地址读取不到。一个移动设备都有wifi,这个应该都会有,不过也是不能保证不重复。

Android_ID在每次恢复工厂模式后,都会重新生成,另外个别手机存在bug,产生的Android_ID都是一样的。与其交给系统产生id,还不如自己产生id。

2. 常用标识的组合

    1. 如果IMEI不为空,返回IMEI,否则,进入2
    2. 如果Sim卡序列号不为空,返回序列号,否则,进入3
    3. 如果MAC地址不为空,md5(mac+"mac_address"),否则进入4
    4. 如果Android_ID不为空,返回Android_ID,否则进入5
    5. 返回"invalid_imei"

如果是统计APP的安装量一般用上面这些方法就可以了。这样统计到的设备数量只会更少,不会更多。

3. 如果要实现设备管理这样的功能怎么办

这就要求保证每个设备的标识不能重复,因此使用上面的方法就不行了。使用UUID来处理,并且持久化到SharedPreference和SD卡,这样只要APP和文件没有同时被干掉,就不会重新生成新的标识。

设备id生成

1. 如果imei不为空,并且长度等于15,那么deviceid = android-imei-uuid-timestamp。否则进入2。
2. deviceid = android-uuid-timestamp

设备id读取

1. 如果从sharedpreference中,读到deviceid,将该id存储到sd卡上,返回改id,否则进入2
2. 如果sd卡中,读到deviceid,那么将该id存储到sharedpreference,返回该id,否则进入3
3. 生成deviceid,存储到sd卡和sharedpreference中

4. 参考文章

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

Android设备标识-没有完美的解决方案-只有取舍

时间: 2024-10-13 15:54:31

Android设备标识-没有完美的解决方案-只有取舍的相关文章

[转] 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID

[心路历程] 最近刚好在思考工作中统计数据所用的标识码产生的数据误差到底有多大,借此机会几番搜索资料+请教大神,整理出此文. 因为自己是产品经理,所以出发点是整理知识点.理解个大概.知道什么不能用.什么标识是靠谱的,并不研究太深入.毕竟非专业开发,有时候若了解知识点太深入,反倒会更困惑(关联知识点太多).即使研究清楚了,工作中碰到和自己研究相悖的情况,也不好丢个文档告诉开发应该怎么做(除非很熟,但次数多了也伤感情). 此外,不同公司.不同开发可能对同一个词的释义/实现方式有略微不同,但基本上是这

关于如何惟一的标识一台Android设备的总结性讨论

想必大家在开发Android项目的时候,多多少少会遇到“如何惟一地标识一台Android设备”等类似的问题.不只是以前,即使是现在乃至可以预见的将来,这个问题都将一直存在. 如果大家使用搜索工具搜索的话,大家也能够找到很多的解决方案,但每种方式都多多少少有些缺陷. 我在这里呢,将向大家解释一下诸多常见方案的不足之处,以及推荐一种相对而言比较靠谱的方法. 首先先要说明一下Android设备的情况.我们大家都知道,在起初的时候,Android设备仅仅意味着是“手机”.如果情况一直是这样就好了.可是事

【Android】设备标识

Android系统以及设备都有很多的“标识”号,比如常见的IMEI,SerizalNumber,UUID等概念,但是这些都存在一定程度上的不可靠性,到底如何标记一台Android设备? 文章内容多来自: 1)http://www.cnblogs.com/lvcha/p/3721091.html 2)http://android-developers.blogspot.com/2011/03/identifying-app-installations.html 尤其第二篇,乃是网上许多文章的根源所

Android—大图or多图加载解决方案(完美解决OOM问题)

在开发应用的时候,很多时候都会涉及大量图片的加载和高精度图片的加载,这两种操作都是会导致应用程序OOM(OutOfMemory)的问题发生,合理的图片加载和图片内存管理就是必须解决的问题,以下将提供一个比较完善的技术方案,解决这两个问题. 首先,我们必须明确为什么会发生OOM(OutOfMemory)的问题,其原因就是因为在APP运行过程中,所使用的系统内存超出了当前APP的最大可用内存,就发生了OOM的问题.下面,我们来估算一下在一台中高档的手机上面,加载多少图片会导致OOM:假设系统分配给A

获取Android设备唯一标识码

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一性并不理想.而通过其他硬件信息标识也因为系统版本.手机硬件等限制存在不同程度的问题. 下面收集了一些“有能力”或“有一定能力”作为设备标识的串码. DEVICE_ID 这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且

如何唯一的标识一台Android设备?

UUID : (Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得). IMEI : (International Mobile Equipment Identit

Android设备唯一标识ID的获取

方法一: 返回的是作为唯一64位十六进制字符串的Android设备ID. import android.provider.Settings.Secure; private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 方法二: UUID是一个128位的全局唯一不可变的标识符(UUID). import java.util.UUID; private stati

Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据

Android系统似乎已经成为世界各地病毒作者的首选目标,每天都有新的恶意软件在感染更多的设备. 这一次,安全公司趋势科技发布警告,他们发现了一个新的Android后门--GhostCtrl GhostCtrl被发现有3个版本,第一代窃取信息并控制一些设备的功能,第二代增加了更多的功能来劫持设备,第三代结合了早期的版本特性,功能更加强大,黑客可以完全控制设备,并访问和传输本地存储的任何数据的权利. 恶魔般的GhostCtrl  GhostCtrl实际上是在2015年底被发现OmniRAT的一个变

Android设备上i-jetty环境的搭建-手机上的web服务器

本文主要跟大家分享如何将一台Android设备打造成一个web服务器使用. 编译i-jetty 1.将源码download下来,http://code.google.com/p/i-jetty/downloads/list 2.解压文件,进入pom.xml所在目录,执行命令:mvncleaninstall,参照(http://code.google.com/p/i-jetty/wiki/BuildInstructions) 执行过程中,出现了异常导致失败,是生成classes.dex时内存溢出的