在作定製需求的時候,須要修改系統通知的聲音,將其禁用掉,避免第三方應用發送通知時,聲音很大,嚇着用戶。索性就把通知聲音關掉。下面就說說關閉聲音的幾種方法,以及修改系統默認聲音的方法。java
在系統代碼 frameworks/base/media/java/android/media/AudioService.java
的開頭定義了兩個數組,一個 MAX_STREAM_VOLUME
這裏面定義了各類聲音的最大值( 最大值不是100 ,因此須要 AudioManager.getStreamMaxVolume(type)
來獲取各個音量的最大值),而後進行設置。android
還定義了一個數組 DEFAULT_STREAM_VOLUME
這裏面則和 MAX_STREAM_VOLUME
裏定義的順序是同樣,代表了各類聲音的默認的大小。此塊代碼以下:sql
/** @hide Maximum volume index values for audio streams */ private static int[] MAX_STREAM_VOLUME = new int[] { 5, // STREAM_VOICE_CALL 7, // STREAM_SYSTEMX_STREAM_VOLUMEMAX_STREAM_VOLUMEMAX_STREAM_VOLUME 7, // STREAM_RING 15, // STREAM_MUSIC 7, // STREAM_ALARM 7, // STREAM_NOTIFICATION 15, // STREAM_BLUETOOTH_SCO 7, // STREAM_SYSTEM_ENFORCED 15, // STREAM_DTMF 15 // STREAM_TTS }; private static int[] DEFAULT_STREAM_VOLUME = new int[] { 4, // STREAM_VOICE_CALL 7, // STREAM_SYSTEM 5, // STREAM_RING 11, // STREAM_MUSIC 6, // STREAM_ALARM 5, // STREAM_NOTIFICATION 7, // STREAM_BLUETOOTH_SCO 7, // STREAM_SYSTEM_ENFORCED 11, // STREAM_DTMF 11 // STREAM_TTS };
若是咱們須要修改默認的通知聲音,則能夠將 STREAM_NOTIFICATION
前面的數值 5 給爲 0便可,這樣默認聲音就爲0 了。數據庫
媒體聲音這些數據在數據庫中都會默認的存放數據,咱們知道大多數的數據都是系統初次啓動的時候在 SettingProvider
應用中加載初始化的值,固然通知的聲音也在裏面。數組
具體的代碼在 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
其中有個方法 loadVolumeLevels(db)
此方法則是加載全部默認聲音大小的地方,具體代碼以下:ide
stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" + " VALUES(?,?);"); loadSetting(stmt, Settings.System.VOLUME_MUSIC, AudioService.getDefaultStreamVolume(AudioManager.STREAM_MUSIC)); loadSetting(stmt, Settings.System.VOLUME_RING, AudioService.getDefaultStreamVolume(AudioManager.STREAM_RING)); loadSetting(stmt, Settings.System.VOLUME_SYSTEM, AudioService.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM)); loadSetting(stmt,Settings.System.VOLUME_VOICE, AudioService.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL)); loadSetting(stmt, Settings.System.VOLUME_ALARM, AudioService.getDefaultStreamVolume(AudioManager.STREAM_ALARM)); loadSetting(stmt,Settings.System.VOLUME_NOTIFICATION, AudioService.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION)); loadSetting(stmt,Settings.System.VOLUME_BLUETOOTH_SCO, AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));
咱們發現loadSetting中把全部聲音相關默認值大小的都寫入數據庫中了,那麼咱們就能夠從這裏下手了,在 Settings.System.VOLUME_NOTIFICATION
的設置項中咱們就把他設置爲0,則系統通知默認的聲音就爲0 ,咱們再看看 AudioService.getDefaultStreamVolume
這個方法的實現.ui
public static int getDefaultStreamVolume(int streamType) { return DEFAULT_STREAM_VOLUME[streamType]; }
實際就是返回了咱們在方案一中系統裏面默認音量大小數組裏面的值。因此方案一和方案二實際是一個效果spa
此屬性值的意思就是通知默認的音樂文件文件名,咱們在系統代碼 build/target/product/full_base.mk
中定義了,若是咱們不想有聲音那麼咱們能夠將默認值改成不存在的文件,則不會播放通知聲音了,固然咱們也能夠在客戶定義的mk中使用 PRODUCT_PROPERTY_OVERRIDES
去複寫此屬性,將其指定爲不存在文件或者爲空,這樣就不會有通知聲音響了。code
系統默認了不少的聲音,那麼咱們要修改一些系統裏默認的音效文件呢,那麼咱們能夠修改 frameworks/base/data/sounds
下面文件及文件夾中的聲音文件,若是改了名字記得要在mk中將原來的替換爲新的名字。這下面的mk的做用是將這些音樂文件所有打包到系統 system/media/audio
下面各個模塊的文件,而後在系統開機的時候,掃描這些文件,將其加入到數據庫中,以後在設置中更換聲音時,則直接從數據庫中查詢這些音樂文件,而後供用戶選擇。get