在车机 Audio 开发中,有很多场景需要设置音量的最大值和最小值问题,例如通话模式通常是禁止静音的,耳机模式调整到较大音量时开机后会恢复一个最大默认值等问题。而且通常情况下不通车型的默认值可能会不同,这篇文章就来看一下如何在一套代码中维护不同车型的默认音量。
一、原生设置
我们先来看一下如果只需要一套代码的时候,该如何保存和使用这些默认值。
1、配置默认值
通常情况下,需要在上面的文件中添加相关默认值属性。
config.xml
源码位置:/packages/services/Car/service/res/values/config.xml
<integer name="mediaMaxVolume">20</integer>
<integer name="mediaMinVolume">5</integer>
<integer name="alarmMaxVolume">20</integer>
<integer name="alarmMinVolume">5</integer>
这里设置了多媒体的最大音量为 20,最小音量为 10。设置了闹钟的最小音量为 5。
2、初始化数据
CarAudioService
源码位置:/packages/services/Car/service/src/com/android/car/CarAudioService.java
public class CarAudioService extends ICarAudio.Stub implements CarServiceBase, PowerEventProcessingHandler {……private static final String MEDIA_MIN_VOLUME = "vendor.media.min.volume";private static final String MEDIA_MAX_VOLUME = "vendor.media.max.volume";private static final String ALARM_MIN_VOLUME = "vendor.alarm.min.volume";private static final String ALARM_MAX_VOLUME = "vendor.alarm.max.volume";private int mMediaMinVolume;private int mMediaMaxVolume;private int mAlarmMinVolume;private int mAlarmMaxVolume;@Overridepublic void init() {……synchronized (mImplLock) {……Resources res = mContext.getResources();mMediaMinVolume = res.getInteger(R.integer.mediaMinVolume);mMediaMaxVolume = res.getInteger(R.integer.mediaMaxVolume);mAlarmMinVolume = res.getInteger(R.integer.alarmMinVolume);mAlarmMaxVolume = res.getInteger(R.integer.alarmMaxVolume);SystemProperties.set(MEDIA_MIN_VOLUME, String.valueOf(mMediaMinVolume));SystemProperties.set(MEDIA_MAX_VOLUME, String.valueOf(mMediaMaxVolume));SystemProperties.set(ALARM_MIN_VOLUME, String.valueOf(mAlarmMinVolume));SystemProperties.set(ALARM_MAX_VOLUME, String.valueOf(mAlarmMaxVolume));……}……}……
}
这里就是取出 xml 中的数据,存储到系统变量中,我们这里看一下存储方式。
SystemProperties
源码位置:/frameworks/base/core/java/android/os/SystemProperties.java
/*** 提供对系统属性存储的访问权限。系统属性存储包含字符串键值对列表。* 该类仅用于本地的系统属性。*/
public class SystemProperties {private static final boolean TRACK_KEY_ACCESS = false;public static String get(@NonNull String key) {if (TRACK_KEY_ACCESS) onKeyAccess(key);return native_get(key);}public static String get(@NonNull String key, @Nullable String def) {if (TRACK_KEY_ACCESS) onKeyAccess(key);return native_get(key, def);}
}
可以看到这就相当于一个用于存储系统属性的工具类。
3、获取数据
在需要的位置获取上面存储的数据来使用。
private static final String MEDIA_MIN_VOLUME = "vendor.media.min.volume";
private static final String MEDIA_MAX_VOLUME = "vendor.media.max.volume";
private static final String ALARM_MIN_VOLUME = "vendor.alarm.min.volume";
private static final String ALARM_MAX_VOLUME = "vendor.alarm.max.volume";private int mMediaMinVolume;
private int mMediaMaxVolume;
private int mAlarmMinVolume;
private int mAlarmMaxVolume;mMediaMinVolume = SystemProperties.get(MEDIA_MIN_VOLUME);
mMediaMaxVolume = SystemProperties.get(MEDIA_MAX_VOLUME);
mAlarmMinVolume = SystemProperties.get(ALARM_MIN_VOLUME);
mAlarmMaxVolume = SystemProperties.get(ALARM_MAX_VOLUME);
这样就拿到了对应的相关数据,用来对音量信息的判断与恢复。
二、定制设置
如果只有一组设置,直接使用上面的代码就可以了。但是如果当前有多个车型,且对音量的边界值设置还不一样,这就需要定制化设置了。例如我们有 xx01 和 xx02 两个车型,他们的定制化文件存放在 /device/xiaoxu/xx01 和 /device/xiaoxu/xx02 下。
1、配置默认值
这里配置默认值需要覆盖上面的配置信息,所以需要添加 overlay 路径。
xx01
源码位置:/device/xiaoxu/xx01/overlay/packages/services/Car/service/res/values/config.xml
<integer name="mediaMaxVolume">18</integer>
<integer name="mediaMinVolume">3</integer>
<integer name="alarmMaxVolume">18</integer>
<integer name="alarmMinVolume">3</integer>
xx02
源码位置:/device/xiaoxu/xx02/overlay/packages/services/Car/service/res/values/config.xml
<integer name="mediaMaxVolume">22</integer>
<integer name="mediaMinVolume">7</integer>
<integer name="alarmMaxVolume">22</integer>
<integer name="alarmMinVolume">7</integer>
这样该文件就会覆盖上面的设置,而对于数值的初始化和获取方式与上面的相同,这里就不再重复添加。