HCRM博客

为何在获取设备ID时会出现报错?

Android 获取设备ID报错问题详解

一、背景介绍

在Android开发中,设备ID(Device ID)是一种用于唯一标识用户设备的标识符,它常用于广告跟踪、用户分析等场景,随着Android版本的迭代,特别是从Android 10开始,Google为了保护用户隐私,对设备ID的获取进行了严格限制。

为何在获取设备ID时会出现报错?-图1
(图片来源网络,侵权删除)

二、问题描述

当应用的targetSdkVersion升级到API 29(Android 10)及以上时,调用getDeviceId()和getIMEI()等方法会导致崩溃,抛出java.lang.SecurityException异常,这是因为从Android 10开始,应用必须具有READ_PRIVILEGED_PHONE_STATE特权权限才能访问设备的不可重置标识符(如IMEI和序列号),而第三方应用无法声明此特权权限,因此会引发安全异常。

三、解决方案

1. 替代方案:使用Android ID

由于直接获取设备ID和IMEI号受到限制,推荐使用Android ID作为替代方案,Android ID是Android系统为每个设备生成的唯一标识符,可以在设备恢复出厂设置或签名key变更后可能改变,虽然不如IMEI稳定,但在大多数情况下可以满足需求。

示例代码:

public static String getDeviceId(Context context) {
    final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
    if (targetSdkVersion > Build.VERSION_CODES.P && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
        return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
    } else {
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling ActivityCompat#requestPermissions here to request the missing permissions, and then overriding public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) to handle the case where the user grants the permission. See the documentation for ActivityCompat#requestPermissions for more details.
            return null;
        }
        return telephonyManager.getDeviceId();
    }
}

2. 特殊情况处理:设备所有者或资料所有者应用

如果您的应用是设备所有者或资料所有者应用,那么即使以Android 10或更高版本为目标平台,您也只需READ_PHONE_STATE权限即可访问不可重置的设备标识符,如果您的应用具有特殊运营商权限,则无需任何权限即可访问这些标识符。

为何在获取设备ID时会出现报错?-图2
(图片来源网络,侵权删除)

注意: 这种应用通常不是普通第三方应用,而是具有特殊权限的企业或个人设备管理应用。

3. 最佳实践建议

避免滥用敏感权限: 尽量避免在应用中滥用敏感权限,特别是涉及用户隐私的权限,如果确实需要访问设备标识符,请确保已获得用户的明确同意。

使用广告ID: 如果应用主要用于广告跟踪或用户分析目的,请考虑使用Android广告ID(Advertising ID),这是一个相对稳定且安全的替代方案。

适配多版本: 针对不同的Android版本进行适配,确保应用在各个版本上都能正常运行,同时遵循各版本的安全和隐私规范。

随着Android系统对用户隐私保护的不断加强,开发者在获取设备ID时需要特别注意权限问题,通过采用推荐的替代方案(如Android ID)和遵循最佳实践建议,可以在确保应用功能的同时,最大限度地保护用户隐私。

为何在获取设备ID时会出现报错?-图3
(图片来源网络,侵权删除)
分享:
扫描分享到社交APP
上一篇
下一篇