安卓11环境下Java开发安卓应用如何获取设备IMEI号码?
安卓11无法获取IMEI的原因与解决方案
核心限制说明
从安卓10(API 29)开始,谷歌对不可重置的硬件标识符做了系统级权限收紧:普通第三方应用即便授予android.permission.READ_PHONE_STATE权限也无法访问IMEI、MEID、设备序列号等标识。仅有两类应用不受该限制:
- 拥有系统签名的预装系统级应用
- 具备特殊授权的运营商应用
可行替代方案
1. 使用Android ID作为替代
绝大多数业务场景下,Settings.Secure.ANDROID_ID可满足唯一标识需求,该值在用户首次设置设备后固定,仅在恢复出厂设置、刷机或Root后修改。
获取代码:
import android.provider.Settings; String androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
2. 广告ID(适用于统计/广告归因场景)
如果你的需求是广告归因、用户行为统计,可使用谷歌广告ID,该ID用户可手动重置,符合隐私合规要求。
获取代码(需集成谷歌移动广告SDK):
import com.google.android.gms.ads.identifier.AdvertisingIdClient; try { AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context); String advertisingId = adInfo.getId(); } catch (IOException | GooglePlayServicesNotAvailableException | GooglePlayServicesRepairableException e) { e.printStackTrace(); }
注意:该方案依赖设备GMS服务,国内无GMS的设备无法使用。
3. 应用内自定义唯一标识
如果仅需要应用内唯一标识,可随机生成UUID存储在应用沙盒中,只要用户不卸载重装就不会变更:
import java.util.UUID; String appUniqueId = UUID.randomUUID().toString(); // 后续存储到SharedPreferences或应用私有目录即可
4. 企业级场景特殊方案
如果开发的是企业MDM类设备管理应用,可申请READ_PRIVILEGED_PHONE_STATE权限,该权限仅对设备所有者、配置文件所有者或系统预装应用开放,普通应用无法申请。
内容的提问来源于stack exchange,提问作者singhV
相关产品推荐
相关产品推荐

