项目中出现了将设备和用户信息进行绑定的需求。最先想到的是IMEI串码和IMSI串码。手机登陆的时候一直都没有问题。换了一个平板中之后IMEI和IMSI串码都获取不到了。后来查了一下原因,是因为平板上是没有手机卡的。所以手机上就获取不到串码了。当然,如果运营商没有将对应的信息写入到手机卡上的时候也不能获取到对应的信息(这是网上说的,没有经过验证)。

将手机信息和用户信息进行绑定,的一个主要原则就是可靠的。不管它是什么值,硬件的值也好,网络运营商给我们的值也好,只要他够稳定就ok。

然后介绍一下网络上的各种各样的方法。有一个比较全的:http://www.cnblogs.com/anxin1225/p/3376516.html 。简单评价一下这几种方法IMEI和IMSI这个就不提了。没什么争议。

1. MAC ADDRESS:按照作者的说法。这个是肯定不能用的,我用Wifi登录和3G网络登录居然不是一个用户,果断不能接受,直接pass

2.Serial Number:部分用户获取不到,但是一旦获取到的数据就是可靠的。这个数据我们还是可以利用的。

3.ANDROID_ID:是设备第一次启动的时候产生和存储的64Bit的一个值,比较稳定。但是有缺点。在Android 2.2设备上的时候这个值不可靠。当然了,如果你的应用是刚好避开了这个弊端的话。很好,你可以不用看我废话了。直接使用这个值就好了。

4. Installtion ID : UUID:看上去很完美了。手机软件、系统重装之后,这个值应该就会改变了。

5. Pseudo-Unique ID:我觉得这个是最坑爹的一个算法。因为如果批量购买的设备里边出现相同的串码的几率可能大的吓人。

好吧开始解释一下我的想法吧。其实跟之前的差不多。

1.我们在服务器上用Id生成器来生成唯一的串码,如果你不会,@我 我会把Id生成器那一段也搞出来。

2.首先获取IMEI串码,如果有值直接将IMEI串码返回出来。

3.获取IMSI串码,如果有值,直接将IMSI串码返回出来。

4.ok,如果执行到这个地方,那就只能说明IMEI串码和IMSI串码已经失效了。我们需要弃用备用方案了。首先查看我们的数据库中有没有已经保存的可用的网络串码。如果有直接返回,如果没有从网络中获取串码,保存,并且返回出去。

public static String getPhoneId(Context context) {
String id = ""; TelephonyManager mTelephonyMgr = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
// 获取IMSI号
id = mTelephonyMgr.getSimSerialNumber();
if (!StringTools.IsNullOrEmpty(id))
return "S" + id; // 获取IMEI号
id = mTelephonyMgr.getDeviceId();
if (!StringTools.IsNullOrEmpty(id))
return "E" + id; if (StringTools.IsNullOrEmpty(id)) {
// 通过ID生成器获取编码
id = DBTools.getDataFromCommonDB(context, PHONE_ID);
if (StringTools.IsNullOrEmpty(id)) {
try {
id = "R" + IdGeneratorTools.Instance().NextLong();
DBTools.saveDataForCommonDB(context,
new KeyValuePair<String, String>(PHONE_ID, id));
} catch (Exception e) {
e.printStackTrace();
}
}
} return id;
}

我的这种方式的,对于大部分机器都是可以做到软件卸载,手机重装都不会丢失用户信息。仍然有一小部分,是没有办法做到的。但是软件数据库不清除的情况下还是非常实用的。好了,有事联系我

Android 获取可靠的手机编码的更多相关文章

  1. android获取手机信息大全

    IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...

  2. Android获取手机制作商,系统版本等

    在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息. android.os.Build类中.包括了这样的一些信息.我们可以直接调用 而不需要添加任何的权限和 ...

  3. android获取手机信息2

    IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...

  4. Android 获取手机SIM资料详解

    TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...

  5. Android 获取手机信息

    private void initData() { TelephonyManager mTm = (TelephonyManager) getActivity().getSystemService(C ...

  6. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  7. Android ADB工具-操作手机和获取手设备信息(四)

    Android ADB工具-操作手机和获取手设备信息(四) 标签(空格分隔): Android ADB 6. 其它命令 命令 功能 adb shell input text <content&g ...

  8. [转] android获取手机信息大全

    原文链接:http://blog.csdn.net/hytfly/article/details/8552483 IMEI号,IESI号,手机型号: private void getInfo() { ...

  9. 获取android的SDK或者手机目录路径

    获取android的SDK或者手机目录路径 Google为我们提供了API来获取SDK或者手机目录路径: 1.获取SD卡目录 File file1 = Environment.getExternalS ...

随机推荐

  1. objective-c(反射)

    objective-c中提供类似JAVA的反射特性,给出基本例子如下: #import <Foundation/Foundation.h> @interface ClassA : NSOb ...

  2. Java虚拟机4:内存溢出

    堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了.所以测试的时候把堆的大小固定住并且让堆不可扩展即可.测试代码 ...

  3. 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  4. 通过分析iframe和无阻塞脚本关系能让我们更懂iframe

    在我上篇文章里,我提到一种使用iframe完成无阻塞脚本加载的方式,因为我对iframe的偏见很大,所以上篇文章里我没有展开讨论这个问题. 文章发表后有位网友问了我这样一个问题,下面是他问题的原文,如 ...

  5. java POI实现向Excel中插入图片

          做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...

  6. [PCB设计] 1、硬件原理图设计规范(一)——基本原则

    1.1 目的 原理图设计是产品设计的理论基础,设计一份规范的原理图对设计PCB.跟机.做客户资料具有指导性意义,是做好一款产品的基础.原理图设计基本要求: 规范.清晰.准确.易读. 因此制定此< ...

  7. asp.net web api CORS

    using System; using System.Web.Http.Filters; public class AllowCrossSiteJsonAttribute : ActionFilter ...

  8. Java用来进行批量文件重命名,批量提取特定类型文件

    原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...

  9. Redis批量删除KEY的方法

    Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作. 代码如下: redis-cli keys “* ...

  10. ::after::before清除浮动原理

    先来看一段代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...