Android设备已配置设备名称却获取到设备型号,求问题原因
问题原因分析
你的代码逻辑是读取系统设置中的设备名称,为空时返回设备型号,但部分已配置名称的设备仍返回型号,主要有以下几个可能原因:
- API版本兼容性问题:
Settings.Global.DEVICE_NAME(对应字符串"device_name")是Android 7.1(API 25)才新增的系统设置项。如果设备系统版本低于API 25,即使用户配置了设备名称,用这个键读取也会返回null,从而触发getDeviceNameIfNull()返回型号。 - 权限未正确授予:从Android 6.0(API 23)开始,读取系统设置需要申请
android.permission.READ_SYSTEM_SETTINGS权限,且该权限属于危险权限,需要动态申请。如果你的应用未获取该权限,Settings.Global.getString()会返回null,导致 fallback 到设备型号。 - 厂商定制系统的键名差异:部分厂商会修改系统设置的存储结构,设备名称可能被存在
Settings.Secure或其他自定义设置项中,而非Settings.Global下的"device_name",导致读取不到已配置的名称。 - 硬编码键名的潜在问题:直接使用字符串"device_name"而非官方常量
Settings.Global.DEVICE_NAME,可能因厂商对键名的定制修改,导致读取失败返回null。
修复建议
针对上述问题,可以做以下调整:
- 兼容低API版本:对于API 25以下的设备,改用
BluetoothAdapter.getName()获取设备名称(需注意蓝牙权限,该名称通常和系统设备名称一致),或者结合系统版本判断做兜底:
fun getDeviceName(): String { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { Settings.Global.getString(context.contentResolver, Settings.Global.DEVICE_NAME) ?: getDeviceNameIfNull() } else { val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() bluetoothAdapter?.name ?: getDeviceNameIfNull() } }
- 确保权限正确申请:在Manifest中添加权限声明:
<uses-permission android:name="android.permission.READ_SYSTEM_SETTINGS" />
并在运行时针对API23及以上设备动态申请该权限。
- 使用官方常量替代硬编码:把字符串"device_name"替换为
Settings.Global.DEVICE_NAME,避免键名拼写或厂商定制导致的读取失败。
内容的提问来源于stack exchange,提问作者KiritoCode
相关产品推荐
相关产品推荐

