原理:

(尽可能实现,同一设备在不刷机不恢复出厂的情况下,每次生成的设备指纹不变;并且尽可能保证两部不同的设备生成的设备指纹不能一样)

1.将imei号+手机硬件信息+androidID拼接成一个字符串(由于个别手机某些时候获取的wifi MAC和蓝牙MAC不一致,故舍去这两项);

2.再用MD5把以上信息处理成32位的字符串;

代码实现如下:

package com.barry.utils;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import android.content.Context;

import android.os.Build;

import android.provider.Settings.Secure;

import android.telephony.TelephonyManager;

import android.util.Log;

/**

* 获取设备指纹的工具类

* @author BarryHuang

* @DATE 2015-8-19

*/

public class FingerprintUtil {

private static final String TAG = "FingerprintUtil";

/**

* 生成一个设备指纹(耗时50毫秒以内):

* 1.IMEI + 设备硬件信息(主要)+ ANDROID_ID + WIFI MAC组合成的字符串

* 2.用MessageDigest将以上字符串处理成32位的16进制字符串

* @param context

* @return 设备指纹

*/

public static String createFingerprint(Context context) {

//long startTime = System.currentTimeMillis();

// 1.IMEI

TelephonyManager TelephonyMgr = (TelephonyManager) context

.getSystemService(Context.TELEPHONY_SERVICE);

final String imei = TelephonyMgr.getDeviceId();

Log.i(TAG,"imei="+imei);

//2.android 设备信息(主要是硬件信息)

final String hardwareInfo = Build.ID + Build.DISPLAY + Build.PRODUCT

+ Build.DEVICE + Build.BOARD + Build.CPU_ABI

+ Build.MANUFACTURER + Build.BRAND + Build.MODEL

+ Build.BOOTLOADER + Build.HARDWARE /* + Build.SERIAL */

+ Build.TYPE + Build.TAGS + Build.FINGERPRINT + Build.HOST

+ Build.USER;

//Build.SERIAL => 需要API 9以上

Log.i(TAG,"hardward info="+hardwareInfo);

/* 3. Android_id 刷机和恢复出厂会变

* A 64-bit number (as a hex string) that is randomly

* generated when the user first sets up the device and should remain

* constant for the lifetime of the user's device. The value may

* change if a factory reset is performed on the device.

*/

final String androidId = Secure.getString(context.getContentResolver(),

Secure.ANDROID_ID);

Log.i(TAG,"android_id="+androidId);

/**

* 4. The WLAN MAC Address string(个别手机刚开机完成后会获取不到,舍去)

*/

/*WifiManager wifiMgr = (WifiManager) context

.getSystemService(Context.WIFI_SERVICE);

final String wifiMAC = wifiMgr.getConnectionInfo().getMacAddress();

Log.i(TAG,"wifi Mac="+wifiMAC);*/

/*

* 5. get the bluetooth MAC Address

* (有部分手机,如三星GT-S5660 2.3.3,当蓝牙关闭时,获取不到蓝牙MAC;

* 所以为了保证 device id 的不变,舍去)

*/

/*BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

String bt_MAC = null;

if (bluetoothAdapter == null) {

Log.e(TAG, "bluetoothAdapter is null");

} else {

bt_MAC = bluetoothAdapter.getAddress();

}

Log.i(TAG,"m_szBTMAC="+bt_MAC);*/

// Combined Device ID

final String deviceId = imei + hardwareInfo + androidId/* + wifiMAC + bt_MAC*/;

Log.i(TAG,"deviceId="+deviceId);

// 创建一个 messageDigest 实例

MessageDigest msgDigest = null;

try {

msgDigest = MessageDigest.getInstance("MD5");

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

//用 MessageDigest 将 deviceId 处理成32位的16进制字符串

msgDigest.update(deviceId.getBytes(), 0, deviceId.length());

// get md5 bytes

byte md5ArrayData[] = msgDigest.digest();

// create a hex string

String deviceUniqueId = new String();

for (int i = 0; i < md5ArrayData.length; i++) {

int b = (0xFF & md5ArrayData[i]);

// if it is a single digit, make sure it have 0 in front (proper

// padding)

if (b <= 0xF) deviceUniqueId += "0";

// add number to string

deviceUniqueId += Integer.toHexString(b);

//Log.i(TAG,"deviceUniqueId=" + deviceUniqueId);

} // hex string to uppercase

deviceUniqueId = deviceUniqueId.toUpperCase();

Log.i(TAG,"生成的设备指纹:" + deviceUniqueId);

//Log.i(TAG,TAG, "生成DeviceId 耗时:"+(System.currentTimeMillis() - startTime));

return deviceUniqueId;

}

}

android 获取设备指纹,Android唯一识别号(设备指纹)的生成相关推荐

  1. 无接任何usb设备却提示无法识别usb设备

    无接任何usb设备却提示"无法识别usb设备",证明了主板的某个usb端口已经坏了 这时你可以打开"设备管理器"打开"通用串行总线控制器" ...

  2. android获取包版本,Android获取应用名称、版本号、应用包名称,移动设备ID、MAC地址、基站信息和手机型号等详细信...

    创建一个android应用(AndroidTest),所需权限如下(AndroidManifest.xml文件): 接下来是MainActivity.java文件: package com.examp ...

  3. android 获取当前坐标,Android获取位置信息的方法

    本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务 ...

  4. android获取安卓版本,Android开发:获取安卓App版本号的方法步骤

    今天国庆节,在这举国欢庆的日子里,发一篇博文留念一下这个特殊的日子,国庆依然奋战在工作一线. 在Android开发过程中,想要开发一个完整功能的App,各个地方的内容都要涉及到,比如获取App的系统版 ...

  5. android获取图片缩略图,Android系获取图片和视频的缩略图

    获取手机里视频缩略图: public static Bitmap getVideoThumbnail(ContentResolver cr,Uri uri) { Bitmap bitmap = nul ...

  6. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取

    Android系统信息获取 之十三:Linux内核版本信息获取 Android系统是基于Linux的,各个Android版本对应的Linux版本不尽相同,我们这里不去追究各个Android对应的Lin ...

  7. android获取未知字符串,android – 未知的URL内容:// downloads / my_dow...

    我正在使用Download Manger下载一些多媒体文件并对其进行分类.我也在使用Crashlytics,这是一个错误,我经常在不同的设备和Android版本上得到它.我正在寻找你的解决方案/建议! ...

  8. android 获取对话框对象,Android 基本Dialog和自定义Dialog

    Android 基本Dialog和自定义Dialog Dialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类 1.AlertDialog 此对话框可以显示标题,最多三个按钮, ...

  9. android获取程序名称,Android获取应用程序名称(ApplicationName)示例

    MainActivity如下: 代码如下: package cn.testapplicationname; import android.os.Bundle; import android.widge ...

最新文章

  1. 自己写的Treeview控件绑定数据源
  2. icinga安装介绍,监控软件
  3. 10月第1周中国.COM域名增1万个 涨幅环比缩小82%
  4. 《Pokemon Go》开发商明年将推出「哈利波特」题材AR游戏
  5. java rmi 还有用吗_java rmi使用后的感想
  6. Go之Beego原生查询QueryRow QueryRows Values ValuesList ValuesFlat RowsToMap RowsToStruct
  7. leetcode1476. 子矩形查询
  8. (转) Hibernate框架基础——操纵持久化对象的方法(Session中)
  9. 《剑指offer》面试题25——二叉树中和为某一值的路径
  10. Fatal error in launcher: Unable to create process using ‘“c:\python27\python.exe“ “C:\Python27\Scri
  11. sir模型初始值_SIR 模型笔记
  12. 腾讯云支付平台配置掌优云音响
  13. linux去除文件中重复行,2.25 uniq(检查及删除文本文件中重复出现的行列)
  14. 输入框input或内容区域textarea中关于光标移动问题
  15. 你也可以掌控EMI:EMI基础及无Y电容手机充电器设计
  16. [RK3288]PMU配置(RK808)【转】
  17. 暴雪娱乐-魔兽世界:地下城的环境艺术
  18. YS_20190822_图像_Matlab_04
  19. python的秘密_Shamir秘密共享方案 (Python)
  20. 移动WEB学习 - 字体图标、平面转换、渐变

热门文章

  1. 达梦数据库的主要数据类型
  2. docker-compose常用命令和yml配置文件
  3. 一维数组的声明与使用
  4. facebook,twitter的分享图片功能,facebook分享图片
  5. mysql的卸载与安装(超详细)
  6. 商业智能BI财务分析,狭义的财务分析和广义的财务分析有何不同?
  7. Oracle高级队列介绍
  8. 我的世界java笔刷指令_笔刷-goBrush 插件 | 我的世界 | MC世界侠
  9. linux内存寻址实例,Linux内存寻址
  10. Missing Private key解决方案——IOS证书 .cer 以p12文件