需求场景:有部分场景需要修改设备名称,用于设备名称展示和 xts 送测等场景。
需求分析:修改设备名称的入口在设置-关于设备-设备名称,同理在设置-蓝牙中开启蓝牙也会有设备名称入口。
1.Settings 源码的 DeviceName.ets 中
@State deviceName: string = AboutDeviceModel.getSystemName();
TextInput({ text: this.deviceName })

2.默认值:AboutDeviceModel.getSystemName() 从 settingsData 中获取,当 settingsData 中拿不到值时,则显示为 DEVICE_NAME = ‘OpenHarmony 2.0 Canary’;

  /**
   * Get system name from SettingsData
   */
  @Log
  @CatchError(ConfigData.DEVICE_NAME)
  getSystemName() {
    let context = GlobalContext.getContext().getObject(GlobalContext.globalKeySettingsAbilityContext) as common.Context;
    let deviceName = settings.getValueSync(context, ConfigData.SETTINGSDATA_DEVICE_NAME, ConfigData.DEVICE_NAME);
    return deviceName;
  }

SETTINGSDATA_DEVICE_NAME = settings.general.DEVICE_NAME;
DEVICE_NAME = ‘OpenHarmony 2.0 Canary’;

3.如果需要配置默认值则需要匹配到 SettingsData 中的 settings.general.DEVICE_NAME。
SettingsData 中 SettingsDBHelper.ets 代码如下:

    let tableName: string = this.getTableName(TableType.SETTINGS, this.DEFAULT_USER_ID);
    // 初始化设备名称
    let deviceName: string = deviceInfo.marketName;
    if (deviceName.startsWith('"') && deviceName.endsWith('"')) {
      deviceName = JSON.parse(deviceName);
    }
    await this.loadTableSettings(settings.general.DEVICE_NAME, deviceName, tableName);

4.实际读得是 deviceInfo.marketName 得默认值,其对应的属性为 const.product.name。
./startup/init/interfaces/innerkits/syspara/parameter.c:137: return GetProperty(“const.product.name”, &marketName);
修改此属性为想要的设备名称即可。
./startup/init/services/etc/param/ohos.para:22:const.product.name=”OpenHarmony 3.2”

5.开发版中替换验证,可以在./etc/param/ohos.para 中修改 const.product.name。重启即可生效。

6.同理在设置的蓝牙目录这一块也是可以显示设备名称。当在配置中修改默认值或手动修改设备名称后,再搜索蓝牙即可方便快捷的找到对应的设备。

  registerBluetoothStateObserver(callback: (data: boolean) => void) {
    LogUtil.debug(`${this.TAG} subscribeStateChange call`)
    bluetooth.on('stateChange', (data) => {
      LogUtil.debug(`${this.TAG} subscribeStateChange->stateChange data:${data}`);
      switch (data) {
        case bluetooth.BluetoothState.STATE_ON:
          let deviceName: string = this.getSystemName()
          let curDeviceName: string = bluetooth.getLocalName()
          LogUtil.debug(this.TAG + "subscribeStateChange get deviceName: " + deviceName + " ; curDeviceName: " + curDeviceName)
          if (deviceName !== curDeviceName) {
            LogUtil.debug(this.TAG + "subscribeStateChange deviceName != curDeviceName")
            bluetooth.setLocalName(deviceName)
          }
          bluetooth.setBluetoothScanMode(4, 0)
          LogUtil.debug(`${this.TAG} subscribeStateChange->stateChange return: true`)
          callback && callback(true)
          break;
        case bluetooth.BluetoothState.STATE_OFF:
          LogUtil.debug(`${this.TAG} subscribeStateChange->stateChange return: false`)
          callback && callback(false)
          break;
        default:
          break;
      }
    })
  }

7.之前遇到过各种场景导致设备名称不生效的,比如const.product.name属性配置被覆盖,settingsData未安装未被发现等等,如有类似问题可以一一排查。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐