Android开发中有时候因业务需要客户端要产生一个唯一的标识符使服务器能识别某台Android设备,目前一般使用三种标识符分别为DeviceIdAndroidIdMAC地址

获取DeviceId

在获取deviceId之前先要要AndroidManifest中声明权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

通过以下代码获取DeviceId:

    public static String getDeviceId(Context context){
String deviceId = null;
if(ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
deviceId = tm.getDeviceId();
}
return deviceId;
}

在获取设备ID时应该注意:

  • 需要READ_PHONE_STATE权限
  • 在6.0或更高的设备上时因为权限要在运行时请求而READ_PHONE_STATE是一个dangerous权限用户极有可能不允许这个权限请求

获取AndroidId

获取AndroidId是不需要权限的但是AndroidId是可能变的,AndroidId是在用户第一次激活这个设备时产生的所以当用户重置手机时AndroidId会产生变化,理论上这个AndroidId是可以接受的毕竟重置手机这个事发生也不会太频繁。

获取AndroidId:

 public static String    getAndroidId(Context context){
return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}

获取MAC地址

可以使用WIFI的MAC地址来作为标识符,感觉现阶段这种方式比较可靠总结如下:

  • Mac地址是唯一的
  • 直接产生在硬件上基本上不会变更
  • 不需要额外的权限
  • 向上或向下兼容
    public static String getMacAddress(Context context) {
String macAddress = null;
try{
String wifiInterfaceName = "wlan0";
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iF = interfaces.nextElement();
if(iF.getName().equalsIgnoreCase(wifiInterfaceName)) {
byte[] addr = iF.getHardwareAddress();
if (addr == null || addr.length == 0) {
return null;
} StringBuilder buf = new StringBuilder();
for (byte b : addr) {
buf.append(String.format("%02X:", b));
}
if (buf.length() > 0) {
buf.deleteCharAt(buf.length() - 1);
}
macAddress = buf.toString();
break;
}
}
}catch (SocketException se){
macAddress = null;
} if(TextUtils.isEmpty(macAddress)){
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE);
macAddress = wifi.getConnectionInfo().getMacAddress();
} return macAddress;
}

使用Android自带的API时有个坑WifiInfo里面有这样一段代码:

   /**
* Default MAC address reported to a client that does not have the
* android.permission.LOCAL_MAC_ADDRESS permission.
*
* @hide
*/
public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00";

上面的代码是从6.0API复制出来的意思是说如果你没有说明android.permission.LOCAL_MAC_ADDRESS权限那么将返回这个默认的MAC地址我在6.0上的机器上试了一下好像并没有像它说的那样我声明android.permission.LOCAL_MAC_ADDRESS仅限后还是拿到这个默认的MAC地址。也没有继续深究发现通过JAVA的API也是可以使到MAC地址的。



《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。

获取Android设备标识符的更多相关文章

  1. 获取Android设备屏幕分辨率

    1.Android 4.3引入的wm工具: a.获取Android设备屏幕分辨率: adb shell wm size b.获取android设备屏幕密度: adb shell wm density ...

  2. Android 开发 获取Android设备的屏幕高宽

    获得屏幕的宽度和高度有很多种方法: //1.通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); heigth = dm.height ...

  3. 获取Android设备WIFI的MAC地址 “MAC地址”

    需要指出的是:wifi状态和wifi AP状态是互斥的状态:也就是一旦发现WIFI AP打开,WIFI是不能被打开的. 获取Android设备的WIFI MAC地址,首先需要将设备中的WIFI个人热点 ...

  4. Android设备标识符的使用

    设备ID(DeviceId) 获取办法 android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) con ...

  5. 稳定获取Android设备唯一码(UUID)的解决方案

    最近做的一个项目中需要用到Android设备唯一码(UUID)来标识一台设备, Android中设备唯一码有很多,如:MAC地址.IMEI号(DeviceId).IMSI号.ANDROID_ID.序列 ...

  6. 【转】获取android设备 id

    关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...

  7. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  8. Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)

    在我们的APP开发中,通常需要获取到设备的唯一标识.在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬 ...

  9. 获取Android设备的唯一识别码|设备号|序号|UUID

    如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效. 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDevi ...

随机推荐

  1. Linux 下安装 mysql8

    1.下载mysql wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-linux-glibc2.12-x86_64.tar 2. ...

  2. ParquetDecodingException: Can not read value at 0 in block -1 in file hdfs:...

    : jdbc:hive2://master01.hadoop.dtmobile.cn:1> select * from cell_random_grid_tmp2 limit 1; INFO : ...

  3. JVM体系结构详解

    每个Java开发人员都知道字节码将由JRE (Java运行时环境)执行.但是很多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码.解释代码并执行代码.作为开发者, ...

  4. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  5. 【牛客Wannafly挑战赛12】 题解

    传送门:https://www.nowcoder.com/acm/contest/79#question 说是比赛题解,其实我只会前三题: 后面的一定补 T1 题意,在一个长度为n的时间内,问如何选择 ...

  6. HDU 6634 网络流最小割模型 启发式合并

    如果我们先手拿完所有苹果再去考虑花费的话. S -> 摄像头 -> 苹果 -> T 就相当于找到一个最小割使得S和T分开. ans = sum - flow. 然后对于这一个模型, ...

  7. 调度系统Airflow的第一个DAG

    Airflow的第一个DAG 考虑了很久,要不要记录airflow相关的东西, 应该怎么记录. 官方文档已经有比较详细的介绍了,还有各种博客,我需要有一份自己的笔记吗? 答案就从本文开始了. 本文将从 ...

  8. 用webpack构建一个常规项目,好处和坏处分析

    最近项目改版,用webpack重新架构. 些许心得我会写几篇记录一下. 好处如下: 1.ES6语法用起来,babel-loader转义,各种新语法用起来. 2.import 语法写起来,webpack ...

  9. iOS组件化实践

    参考资料: http://wereadteam.github.io/2016/03/19/iOS-Component/#more https://casatwy.com/iOS-Modulizatio ...

  10. 063 Python必备库-从人机交互到艺术设计

    目录 一.概述 二.Python库之图形用户界面 2.1 PyQt5 2.2 wxPython 2.3 PyGObject 三.Python库之游戏开发 3.1 PyGame 3.2 Panda3D ...