简述Android手机常用的设备ID

一、简介

1、设备ID:

简单来说就是一串符号(或者数字)类似于我们的身份证号,映射现实中硬件设备。排除特殊情况(模拟器等),设备ID和设备是一一对应的,我们称之为“唯一设备ID(Unique Device Identifier)

2、设备ID的作用:

关于设备ID的作用,大概可以分为下面几点:

  • 统计需求
    统计需求是设备ID最常见的用途,包括DAU, MAU的统计,行为统计,广告激活的统计等。
  • 业务需求
    设备ID通常也用于业务中。比如结合行为统计做用户画像,以为用户提供个性化的服务,大家感受比较明显的就是新闻类和电商类的APP了。
    这类操作,有利有弊,仁者见仁智者见智。
    又如,定向推送,不一定是广告推送,错误修复,内测推送等也会用到设备ID。
  • 还有是一些和特定业务结合的用途,比如构造分布式ID等。风控需求,设备ID还可用于防刷单,反作弊等。
    当然,风控需求仅靠设备ID是无法完成的,通常需要建立一套反作弊系统。
  • 其他的过多,不一一赘叙
3、对于Android平台而言,没有稳定的API可以让开发者获取到这样的设备ID,这样对id的获取便不是很友好,加之各种模拟器,获取不到的情况比比皆是。

下面我们简单介绍一下常用的设备ID及其获取方法

二、获取设备ID

1、ANDROID_ID

Android ID 是获取门槛最低的,不需要任何权限,64bit 的取值范围,唯一性算是很好的了。
但是不足之处也很明显:
1、刷机、root、恢复出厂设置等会使得 Android ID 改变;
2、Android 8.0之后,Android ID的规则发生了变化:

对于升级到8.0之前安装的应用,ANDROID_ID会保持不变。如果卸载后重新安装的话,ANDROID_ID将会改变。
对于安装在8.0系统的应用来说,ANDROID_ID根据应用签名和用户的不同而不同。ANDROID_ID的唯一决定于应用签名、用户和设备三者的组合。

两个规则导致的结果就是:

第一,如果用户安装APP设备是8.0以下,后来卸载了,升级到8.0之后又重装了应用,Android ID不一样;

第二,不同签名的APP,获取到的Android ID不一样。
其中第二点可能对于广告联盟之类的有所影响(如果彼此是用Android ID对比数据的话),所以Google文档中说“请使用Advertising ID”,
不过大家都知道,Google的服务在国内用不了。对Android ID做了约束,对隐私保护起到一定作用,并且用来做APP自己的活跃统计也还是没有问题的。

获取方法如下:

String android_id = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
2、IMEI

IMEI本该最理想的设备ID,具备唯一性,恢复出厂设置不会变化(真正的设备相关)。然而,获取IMEI需要 READ_PHONE_STATE 权限,估计大家也知道这个权限有多麻烦了。尤其是Android 6.0以后, 这类权限要动态申请,很多用户可能会选择拒绝授权。我们看到,有的APP不授权这个权限就无法使用, 这可能会降低用户对APP的好感度。

而且,Android 10.0 将彻底禁止第三方应用获取设备的IMEI, 即使申请了 READ_PHONE_STATE 权限。

所以,如果是新APP,不建议用IMEI作为设备标识;
如果已经用IMEI作为标识,要赶紧做兼容工作了,尤其是做新设备标识和IMEI的映射。

获取方法如下:

try {
 	  TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
 	  //如果双卡,获取第一张卡的
      android_IMEI = tm.getDeviceId(0);
      SharedPreferencesUtil.setPrefString(context, LxKeys.ID_IMEI, android_IMEI);
  } catch (Exception e) {
         e.printStackTrace();
  }
3、MAC

获取MAC地址也是越来越困难了,
Android 6.0以后通过 WifiManager 获取到的mac将是固定的:02:00:00:00:00:00 ,
再后来连读取 /sys/class/net/wlan0/address 也获取不到了。
如今只剩下面这种方法可以获取(没有开启wifi也可以获取到):

public static String getWifiMac() {
    try {
        Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
        if (enumeration == null) {
            return "";
        }
        while (enumeration.hasMoreElements()) {
            NetworkInterface netInterface = enumeration.nextElement();
            if (netInterface.getName().equals("wlan0")) {
                return formatMac(netInterface.getHardwareAddress());
            }
        }
    } catch (Exception e) {
        Log.e("tag", e.getMessage(), e);
    }
    return "";
}

4、OAID

简介:
因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。

近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。(可能存在的问题:部分厂商还没有支持,不过随着更新版本,越来越多的手机已经纳入到兼容范围了)

具体获取方法
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常用手机硬件设备信息包括: 1. 手机型号:手机的型号名称,例如iPhone X、Samsung Galaxy S10等; 2. 操作系统版本:手机所使用的操作系统版本,例如iOS 14、Android 10等; 3. CPU型号和频率:手机的处理器型号和主频,例如Qualcomm Snapdragon 855、Apple A13 Bionic等; 4. 内存大小:手机的内存容量,例如6GB、8GB等; 5. 存储容量:手机的存储空间大小,例如64GB、128GB等; 6. 屏幕分辨率:手机屏幕的分辨率,例如1920x1080、2436x1125等; 7. 相机像素:手机的摄像头像素数,例如1200万像素、4000万像素等; 8. 电池容量:手机的电池容量,例如3000mAh、4000mAh等。 获取这些信息的方法函数在不同的操作系统和编程语言中可能略有不同。在Android系统中,可以使用android.os.Build类中的各种属性获取硬件信息,例如: ``` String model = Build.MODEL; // 手机型号 String osVersion = Build.VERSION.RELEASE; // 操作系统版本 String cpuModel = Build.HARDWARE; // CPU型号 long totalMemory = Runtime.getRuntime().totalMemory(); // 内存总大小 long freeMemory = Runtime.getRuntime().freeMemory(); // 内存可用大小 File path = Environment.getDataDirectory(); // 存储路径 long totalSpace = path.getTotalSpace(); // 存储总大小 long freeSpace = path.getFreeSpace(); // 存储可用大小 DisplayMetrics dm = getResources().getDisplayMetrics(); // 获取屏幕分辨率 int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels; ``` 在iOS系统中,可以使用UIDevice类和NSProcessInfo类中的各种属性获取硬件信息,例如: ``` NSString *model = [[UIDevice currentDevice] model]; // 手机型号 NSString *osVersion = [[UIDevice currentDevice] systemVersion]; // 操作系统版本 NSString *cpuModel = [[NSProcessInfo processInfo] processorDescription]; // CPU型号 NSUInteger totalMemory = [NSProcessInfo processInfo].physicalMemory; // 内存总大小 NSUInteger freeMemory = [NSProcessInfo processInfo].availablePhysicalMemory; // 内存可用大小 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [paths objectAtIndex:0]; // 存储路径 NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:path error:nil]; NSNumber *totalSpace = [fileAttributes objectForKey:NSFileSystemSize]; // 存储总大小 NSNumber *freeSpace = [fileAttributes objectForKey:NSFileSystemFreeSize]; // 存储可用大小 CGSize screenSize = [UIScreen mainScreen].bounds.size; // 获取屏幕分辨率 CGFloat screenWidth = screenSize.width; CGFloat screenHeight = screenSize.height; ``` 需要注意的是,某些硬件信息可能需要特殊的权限才能获取,例如相机像素、电池容量等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值