Android设备获取唯一标识符

概述

有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码。虽然Android系统中提供了这样设备识别码,但是由于Android系统版本、厂商定制系统中的Bug等限制,稳定性和唯一性并不理想。
唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的。下面就来介绍几种标识码:
1.DEVICE_ID;
2.MAC ADDRESS;
3.Sim Serial Number;
4.Serial Number;
5.ANDROID_ID;
6.Installtion ID : UUID;
7.DEVICE_ID:UUID;

DEVICE_ID

概念: 是区别移动设备的标志,储存在移动设备中,可用于监控被窃或无效的移动设备。
关键代码:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
       String IMEI = tm.getDeviceId(); 

优点:
1.根据不同的手机设备返回IMEI,MEID或者ESN码,唯一性良好 。

不足:
1.非手机:如平板电脑,像这样设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法获得DEVICE_ID;
2.权限问题:获取DEVICE_ID需要READ_PHONE_STATE权限;
3.厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾,如:00000000或者****

MAC ADDRESS

概念:可以使用手机Wifi或蓝牙的MAC地址作为设备标识。
Wifi Mac关键代码:

WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        String wlan_mac = wm.getConnectionInfo().getMacAddress(); 

蓝牙 Mac关键代码:

String bt_mac = BluetoothAdapter.getDefaultAdapter().getAddress();

不足:
1.如果设备没有支持WIFI的硬件,就返回null;
2.如果设备没有支持蓝牙的硬件,就返回null。

Sim Serial Number

概念:SIM卡的序列号。
关键代码:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String SimSerialNumber = tm.getSimSerialNumber();

不足:
1.没有装Sim卡时,返回null;
2.对于CDMA设备,返回null。

Serial Number

概念:Android系统2.3版本以上可以获取硬件Serial Number。
关键代码:

String sn = android.os.Build.SERIAL;

优点:非手机设备也可以通过该接口获取ID。

ANDROID_ID

概念:当设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来。
关键代码:

String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

不足:
1.它在Android <=2.1 or Android >=2.3的版本是可靠、稳定的,但在2.2的版本并不是100%可靠的;
2.在主流厂商生产的设备上,有一个很经常的bug,就是每个设备都会产生相同的ANDROID_ID。

Installation ID : UUID

概念:该标识符无需访问设备的资源,也跟设备类型无关。这种标识符是通过在程序安装后第一次运行后生成一个ID实现的,但该标识跟设备唯一标识不一样,它会因为不同的应用程序而产生不同的ID,而不是设备唯一ID。
关键代码:


public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";  
   public synchronized static String id(Context context) {
        if (sID == null) {
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }  

  private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }  

  private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }

}

不足:
1.当卸载应用后重新安装,返回值与之前的值不同。

DEVICE_ID:UUID

概念:为了实现在设备上更通用的获取设备唯一标识,我们可以实现这样的一个类,为每个设备产生唯一的UUID,以ANDROID_ID为基础,在获取失败时以TelephonyManager.getDeviceId()为备选方法,如果再失败,使用UUID的生成策略。
关键代码:

public class DeviceUuidFactory {
    protected static final String PREFS_FILE = "device_id.xml";
    protected static final String PREFS_DEVICE_ID = "device_id";
    protected static UUID uuid;
    public DeviceUuidFactory(Context context) {
        if (uuid == null) {
            synchronized (DeviceUuidFactory.class) {
                if (uuid == null) {
                    final SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE, 0);
                    final String id = prefs.getString(PREFS_DEVICE_ID, null);
                    if (id != null) {
                        // Use the ids previously computed and stored in the prefs file
                        uuid = UUID.fromString(id);
                    } else {
                        final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
                        try {
                            if (!"9774d56d682e549c".equals(androidId)) {
                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
                            } else {
                                final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
                                uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
                            }
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }
                        // Write the value out to the prefs file
                        prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();
                    }
                }
           }
        }
    }

    public UUID getDeviceUuid() {
        return uuid;
    }

}
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。   ◇ 可行性分析报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。   ◇ 项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件及软件资源等。   ◇ 软件需求说明书(软件规格说明书):对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。   ◇ 概要设计说明书:该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。   ◇ 详细设计说明书:着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。   ◇ 用户操作手册:本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。   ◇ 测试计划:为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范围等。   ◇ 测试分析报告:测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。   ◇ 开发进度月报:该月报系软件人员按月向管理部门提交的项目进展情况报告,报告应包括进度计划与实际执行情况的比较、阶段成果、遇到的问题和解决的办法以及下个月的打算等。   ◇ 项目开发总结报告:软件项目开发完成以后,应与项目实施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本和投入的人力,此外,还需对开发工作做出评价,总结出经验和教训。   ◇ 软件维护手册:主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。   ◇ 软件问题报告:指出软件问题的登记情况,如日期、发现人、状态、问题所属模块等,为软件修改提供准备文档。   ◇ 软件修改报告:软件产品投入运行以后,发现了需对其进行修正、更改等问题,应将存在的问题、修改的考虑以及修改的影响作出详细的描述,提交审批。 可行性分析报告 1 引言 1.1 编写目的:阐明编写可行性研究报告的目的,提出读者对象。 1.2 项目背景:应包括   ● 所建议开发软件的名称   ● 项目的任务提出者、开发者、用户及实现软件的单位   ● 项目与其他软件或其他系统的关系。 1.3 定义:列出文档中用到的专门术语的定义和缩写词的原文。 1.4 参考资料:列出有关资料的作者、标题、编号、发表日期、出版单位或资料来源,可包括   ● 项目经核准的计划任务书、合同或上级机关的批文   ● 与项目有关的已发表的资料   ● 文档中所引用的资料,所采用的软件标准或规范 2 可行性研究的前提 2.1 要求:列出并说明建议开发软件的的基本要求,如   ● 功能   ● 性能   ● 输入/输出   ● 基本的数据流程和处理流程   ● 安全与保密要求   ● 与软件相关的其他系统   ● 完成日期 2.2 目标:可包括   ● 人力与设备费用的节省   ● 处理速度的提高   ● 控制精度或生产力的提高   ● 管理信息服务的改进   ● 决策系统的改进   ● 人员工作效率的提高 2.3 条件、假定和限制:可包括   ● 建议开发软件运行的最短寿命   ● 进行显然方案选择比较的期限   ● 经费来源和使用限制   ● 法律和政策方面的限制   ● 硬件、软件、运行环境和开发环境的条件和限制   ● 可利用的信息和资源   ● 建议开发软件投入使用的最迟时间 2.4 可行性研究方法 2.5 决定可行性的主要因素 3 对现有系统的分析 3.1 处理流程和数据流程 3.2 工作负荷 3.3 费用支出:如人力、设备、空间、支持性服务、材料等项开支 3.4 人员:列出所需人员的专业技术类别和数量 3.5 设备 3.6 局限性:说明现有系统存在的问题以及为什么需要开发新的系统 4 所建议技术可行性分析 4.1 对系统的简要描述 4.2 与现有系统比较的优越性 4.3 处理流程和数据流程 4.4 采用建议系统可能带来的影响   ● 对设备

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值