android 获取设备指纹,Android唯一识别号(设备指纹)的生成
原理:
(尽可能实现,同一设备在不刷机不恢复出厂的情况下,每次生成的设备指纹不变;并且尽可能保证两部不同的设备生成的设备指纹不能一样)
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唯一识别号(设备指纹)的生成相关推荐
- 无接任何usb设备却提示无法识别usb设备
无接任何usb设备却提示"无法识别usb设备",证明了主板的某个usb端口已经坏了 这时你可以打开"设备管理器"打开"通用串行总线控制器" ...
- android获取包版本,Android获取应用名称、版本号、应用包名称,移动设备ID、MAC地址、基站信息和手机型号等详细信...
创建一个android应用(AndroidTest),所需权限如下(AndroidManifest.xml文件): 接下来是MainActivity.java文件: package com.examp ...
- android 获取当前坐标,Android获取位置信息的方法
本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务 ...
- android获取安卓版本,Android开发:获取安卓App版本号的方法步骤
今天国庆节,在这举国欢庆的日子里,发一篇博文留念一下这个特殊的日子,国庆依然奋战在工作一线. 在Android开发过程中,想要开发一个完整功能的App,各个地方的内容都要涉及到,比如获取App的系统版 ...
- android获取图片缩略图,Android系获取图片和视频的缩略图
获取手机里视频缩略图: public static Bitmap getVideoThumbnail(ContentResolver cr,Uri uri) { Bitmap bitmap = nul ...
- Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取
Android系统信息获取 之十三:Linux内核版本信息获取 Android系统是基于Linux的,各个Android版本对应的Linux版本不尽相同,我们这里不去追究各个Android对应的Lin ...
- android获取未知字符串,android – 未知的URL内容:// downloads / my_dow...
我正在使用Download Manger下载一些多媒体文件并对其进行分类.我也在使用Crashlytics,这是一个错误,我经常在不同的设备和Android版本上得到它.我正在寻找你的解决方案/建议! ...
- android 获取对话框对象,Android 基本Dialog和自定义Dialog
Android 基本Dialog和自定义Dialog Dialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类 1.AlertDialog 此对话框可以显示标题,最多三个按钮, ...
- android获取程序名称,Android获取应用程序名称(ApplicationName)示例
MainActivity如下: 代码如下: package cn.testapplicationname; import android.os.Bundle; import android.widge ...
最新文章
- 自己写的Treeview控件绑定数据源
- icinga安装介绍,监控软件
- 10月第1周中国.COM域名增1万个 涨幅环比缩小82%
- 《Pokemon Go》开发商明年将推出「哈利波特」题材AR游戏
- java rmi 还有用吗_java rmi使用后的感想
- Go之Beego原生查询QueryRow QueryRows Values ValuesList ValuesFlat RowsToMap RowsToStruct
- leetcode1476. 子矩形查询
- (转) Hibernate框架基础——操纵持久化对象的方法(Session中)
- 《剑指offer》面试题25——二叉树中和为某一值的路径
- Fatal error in launcher: Unable to create process using ‘“c:\python27\python.exe“ “C:\Python27\Scri
- sir模型初始值_SIR 模型笔记
- 腾讯云支付平台配置掌优云音响
- linux去除文件中重复行,2.25 uniq(检查及删除文本文件中重复出现的行列)
- 输入框input或内容区域textarea中关于光标移动问题
- 你也可以掌控EMI:EMI基础及无Y电容手机充电器设计
- [RK3288]PMU配置(RK808)【转】
- 暴雪娱乐-魔兽世界:地下城的环境艺术
- YS_20190822_图像_Matlab_04
- python的秘密_Shamir秘密共享方案 (Python)
- 移动WEB学习 - 字体图标、平面转换、渐变