??????? 在車機 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>
??????? 這樣該文件就會覆蓋上面的設置,而對于數值的初始化和獲取方式與上面的相同,這里就不再重復添加。