在Android开发中获取设备机型(即设备型号)可以通过以下几种方法实现,涵盖不同场景和需求:
1. 通过`Build`类获取基础信息
- 使用`Build.MODEL`获取设备的公开型号(如"SM-G9910"),但部分厂商可能返回非用户友好名称。
- `Build.MANUFACTURER`提供厂商信息(如"samsung"),结合`Build.MODEL`可拼凑完整机型。
- `Build.DEVICE`获取设备内部代号(如"exynos9820"),常用于适配分辨硬件配置。
2. 使用系统Properties扩展信息
- 通过反射读取`SystemProperties`获取更深层信息,例如:
java
String deviceName = SystemProperties.get("ro.product.name", "");
需注意此方法需要`READ_PRIVILEGED_PHONE_STATE`权限,且不同厂商的property键名可能不同。
3. 利用Google Play Services的API
- 通过`UserAgent`类获取标准化设备名称(需依赖Play服务库):
java
String userAgent = UserAgent.get().getModel();
此方法会自动处理厂商差异,返回更易读的名称(如"Pixel 6 Pro")。
4. WebView的UserAgent解析
- 从WebView提取UserAgent字符串,通常包含机型信息:
java
String ua = WebSettings.getDefaultUserAgent(context);
需注意字符串需自行解析,格式如"Mozilla/5.0 (Linux; Android 13; SM-G9910)...".
5. 厂商定制化处理
- 针对华为/小米等厂商,需特殊处理:
- 华为设备可通过`ro.build.display.id`获取带型号的版本信息。
- 小米设备`ro.product.marketname`可能包含市场用机型名称(如"Redmi K50")。
补充说明:
若需要国际标准化机型信息,可接入第三方库如`DeviceInfo`或`AndroidDeviceNames`。
Android 10+对非重置设备标识符有限制,建议使用`Build`类基础信息,避免触发权限问题。
在Kotlin中可通过扩展函数封装机型获取逻辑,例如:
kotlin
fun Context.getDeviceModel(): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
Build.getSerial()
} else {
Build.MODEL
}
}
实际开发时应根据业务场景选择方案,若需用户可见的友好名称推荐结合厂商API或Play Services方案。