android 获取设备唯一标识完美解决方案

复制代码
    /**
* deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符
*
* 渠道标志为:
* 1,andriod(a)
*
* 识别符来源标志:
* 1, wifi mac地址(wifi);
* 2, IMEI(imei);
* 3, 序列号(sn);
* 4, id:随机码。若前面的都取不到时,则随机生成一个随机码,需要缓存。
*
* @param context
* @return
*/
public static String getDeviceId(Context context) {


StringBuilder deviceId = new StringBuilder();
// 渠道标志
deviceId.append("a");

try {

//wifi mac地址
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String wifiMac = info.getMacAddress();
if(!isEmpty(wifiMac)){
deviceId.append("wifi");
deviceId.append(wifiMac);
PALog.e("getDeviceId : ", deviceId.toString());
return deviceId.toString();
}

//IMEI(imei)
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
if(!isEmpty(imei)){
deviceId.append("imei");
deviceId.append(imei);
PALog.e("getDeviceId : ", deviceId.toString());
return deviceId.toString();
}

//序列号(sn)
String sn = tm.getSimSerialNumber();
if(!isEmpty(sn)){
deviceId.append("sn");
deviceId.append(sn);
PALog.e("getDeviceId : ", deviceId.toString());
return deviceId.toString();
}

//如果上面都没有, 则生成一个id:随机码
String uuid = getUUID(context);
if(!isEmpty(uuid)){
deviceId.append("id");
deviceId.append(uuid);
PALog.e("getDeviceId : ", deviceId.toString());
return deviceId.toString();
}
} catch (Exception e) {
e.printStackTrace();
deviceId.append("id").append(getUUID(context));
}

PALog.e("getDeviceId : ", deviceId.toString());

return deviceId.toString();

}

 


       /**
* 得到全局唯一UUID
*/
public static String getUUID(Context context){
SharedPreferences mShare = getSysShare(context, "sysCacheMap");
if(mShare != null){
uuid = mShare.getString("uuid", "");
}

if(isEmpty(uuid)){
uuid = UUID.randomUUID().toString();
saveSysMap(context, "sysCacheMap", "uuid", uuid);
}

PALog.e(tag, "getUUID : " + uuid);
return uuid;
}
}
复制代码

 

posted @   似水流云  阅读(3565)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2012-12-13 android 获取当前系统及应用信息(一)
点击右上角即可分享
微信分享提示