You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。
修复建议

针对上述问题,可以做以下调整:

  1. 兼容低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()
    }
}
  1. 确保权限正确申请:在Manifest中添加权限声明:
<uses-permission android:name="android.permission.READ_SYSTEM_SETTINGS" />

并在运行时针对API23及以上设备动态申请该权限。

  1. 使用官方常量替代硬编码:把字符串"device_name"替换为Settings.Global.DEVICE_NAME,避免键名拼写或厂商定制导致的读取失败。

内容的提问来源于stack exchange,提问作者KiritoCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:35:24