CSipSimple 為開源 SIP 客戶端專案,音量相關設定分散於多層配置與程式碼中。若修改 prefs_media.xml 後預設值不生效,需按優先級順序排查:
MediaManager、AudioManager 相關類別建構子或 init() 中的 setDefaultVolume() 呼叫。SharedPreferences,優先於 XML 預設值。res/xml/prefs_media.xml 中 android:defaultValue 屬性。
// 1. 搜尋程式碼中的預設音量常數
grep -r "DEFAULT_MIC_VOLUME" --include="*.java" .
grep -r "setMicrophoneGain" --include="*.java" .
// 2. 檢查 SharedPreferences 實際值
adb shell
run-as com.csipsimple
cat shared_prefs/com.csipsimple_preferences.xml | grep mic_volume
// 3. 確認 prefs_media.xml 定義
<ListPreference
android:key="mic_volume"
android:defaultValue="5" <!-- 確認此值 -->
android:entries="@array/mic_volume_entries"
android:entryValues="@array/mic_volume_values" />
| 現象 | 原因 | 解決 |
|---|---|---|
| XML 改了不生效 | App 已安裝,SharedPreferences 已有值 | 清除 App 資料或解安裝重裝 |
| 音量過大失真 | Codec 端自動增益控制 (AGC) 或硬體限制 | 調整 Codec 參數或關閉 AGC |
| 不同裝置表現不同 | Audio HAL 實作差異 | 加入裝置特定配置檔 |
MediaManager.setMicrophoneGain() 下斷點,觀察實際傳入值。adb logcat | grep -i "volume\|gain\|mic" 追蹤運行時邏輯。CSipSimple 架構複雜,音量鏈路涉及 UI 設定 → SharedPreferences → MediaManager → AudioTrack/Record → Codec → HAL 多層,建議由上而下系統性排查。