Android音量大小的實現(RingtoneManager和RingerVolumePreference)

來源:互聯網
上載者:User

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來實現的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.