Android音量調節兩種方式


Android音量調節的實現,分兩種情況說明,一種是在settings的音量設置界面,按下側鍵進行調節;另一種是在非settings界面,按下側鍵進行音量調節。這兩種調節方式的實現不一樣,分別操作的是兩個不同的音量SeekBar。下面,分別進行分析:


一. 在settings的音量設置界面,按下側鍵進行調節:

在settings的音量設置界面,按下側鍵回有音量的調節,同時,會播放音樂(這個音樂是在鈴聲設置中設置的),整個過程的實現的相關代碼如下:
1. settings的音量設置界面:
文件: packages/apps/Settings/src/com/android/settings/RingerVolumePreference.java
說明: 在這個RingerVolumePreference,會調用 audioManager.setStreamVolume進行音量大小的調節,但是,播放聲音卻不在這個文件中。
2. 播放音樂:
文件: frameworks/base/core/java/android/preference/VolumePreference.java
說明:RingerVolumePreference繼承自VolumePreference,當點擊側鍵時,VolumePreference的 onKey函數會收到鍵值,並通過mSeekBarVolumizer.changeVolumeBy, sample, mRingtone.play 最終播放出音樂。

值得注意的是:mRingtone.play用的是 new MediaPlayer 的方式,通過創建MediaPlayer來實現音樂的播放。

二. 在非settings界面按側鍵進行音量的調節:

實現: 通過RingtoneManager會調用到AudioManager的adjustStreamVolume,進而調用AudioServicer的adjustStreamVolume,最主要的就是這個函數了。
在這個函數中:

1. checkForRingerModeChange(oldIndex, direction); oldIndex指的是知之前的音量,direction表明是增加還是降低音量。見名知意,這個函數用於檢測改變鈴聲模式,如振動,靜音等,是通過調用 setRingerMode函數來實現的。而setRingerMode通過發送廣播(調用broadcastRingerMode函數)來通知模式的改 變。

2. sendMsg: 發送消息,處理這個消息的是handleMessage函數,調用setStreamVolumeIndex來調節音量,其實,最終是通過AudioPolicyService的對應函數實現的。

3. mVolumePanel.postVolumeChanged(streamType, flags); // 用於更新UI.

4. sendVolumeUpdate: 會發送AudioManager.VOLUME_CHANGED_ACTION,處理這個intent的是最終的目的是用於播放那個短促的蜂鳴聲(見ToneGenerator.java的startTone)。

5. ToneGenerator.java的startTone的分析: 通過jni調用到ToneGenerator.cpp的startTone函數。


值的注意的是,最終是通過AudioTrack來實現這個聲音的處理的,而不是創建MediaPlay, 這與settings中的處理方式是不同的。


題外話: 來電的聲音播放方式也是通過Ringtone,創建MediaPlay來實現的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM