-
大小: 33KB文件類型: .java金幣: 1下載: 0 次發布日期: 2023-04-09
- 語言: Java
- 標簽: SeekBarVolum??SeekBar??Android??
資源簡介
修復了Settings中音量設置的音量條存在回彈、顯示的位置和實際數值不一致等問題。
代碼片段和文件信息
/*
?*?Copyright?(C)?2014?The?Android?Open?Source?Project
?*
?*?Licensed?under?the?Apache?License?Version?2.0?(the?“License“);
?*?you?may?not?use?this?file?except?in?compliance?with?the?License.
?*?You?may?obtain?a?copy?of?the?License?at
?*
?*??????http://www.apache.org/licenses/LICENSE-2.0
?*
?*?Unless?required?by?applicable?law?or?agreed?to?in?writing?software
?*?distributed?under?the?License?is?distributed?on?an?“AS?IS“?BASIS
?*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND?either?express?or?implied.
?*?See?the?License?for?the?specific?language?governing?permissions?and
?*?limitations?under?the?License.
?*/
package?android.preference;
import?android.annotation.UnsupportedAppUsage;
import?android.app.NotificationManager;
import?android.content.BroadcastReceiver;
import?android.content.Context;
import?android.content.Intent;
import?android.content.IntentFilter;
import?android.database.ContentObserver;
import?android.media.AudioAttributes;
import?android.media.AudioManager;
import?android.media.Ringtone;
import?android.media.RingtoneManager;
import?android.net.Uri;
import?android.os.Handler;
import?android.os.HandlerThread;
import?android.os.Message;
import?android.preference.VolumePreference.VolumeStore;
import?android.provider.Settings;
import?android.provider.Settings.Global;
import?android.provider.Settings.System;
import?android.service.notification.ZenModeConfig;
import?android.util.Log;
import?android.widget.SeekBar;
import?android.widget.SeekBar.OnSeekBarChangeListener;
import?com.android.internal.annotations.GuardedBy;
/**
?*?這個類用于供SeekBar設置音量使用,與SeekBar綁定,可以收一個使用者傳入的回調接口SeekBarVolumizer.CallBack。
?*?當音量更改時該類會開始播放音樂,但是需要注意該類不會自動停止音樂的播放,因此需要該類的使用者在CallBack的onSampleStarting中,自己定義何時停止音樂播放,停止音樂播放需要調用該類的stopSample方法
?*?1、當進度條發生改變時,SeekBar的回調會觸發CallBack的onProgressChange方法并將SeekBar的最新值更新到mLastProgress中,并構建一個VOLUME_SET通知后臺線程去將該值存儲到AudioManger中。
?*?2、后臺線程更新完這個值后,AudioManager會發送一個廣播通知音量已更改
?*?3、該類注冊了一個廣播接收器來監聽音量更改事件,當音量發生更改時,該接收器在廣播中取出音量值和音量類型,然后判斷音量類型是否與當前類符合,如果符合則使用將當前音量更新mLastProgress,并通知Ui線程更新SeekBar
?*
?*?所以問題出現在第3點處,主要問題有兩點:
?*???1、mLastProgress這個變量起了兩個作用,第一個記錄最新的SeekBar的值,第二個是記錄廣播發過來的值。
?*??????因為廣播是滯后于滑動的,比如從右向左滑動,則mLastProgress依次被記錄為7654321,正常情況下最后存入的值為最后一個1;
?*??????假設最后當該存入1時,因為執行順序的原因,導致廣播接收器的行為將這個1修改為了2,那么此時就會導致1因為丟失無法存入。
?*
?*??????這個導致了問題進度條和實際音量不相符的現象:即當進度條滑到0時,沒有靜音;或者當進度條滑到1時,依然靜音。
?*
?*??????為了實現最小改動,該問題擬通過增加一個mCurrentProgress變量來進行處理,即將mLastProgress的作用集中,mLastProgress只負責記錄最近的音量大小,即AudioManger發送過過來的音量大小,
?*??????mCurrentProgress記錄SeekBar的當前位置,并將該值存入AudioManger中完成鈴聲設置。
?*??2、setProgress(int?true)方法,該方法true表示使用動畫來實現SeekBar的值過渡,該動畫會造成onProgressChanged上報的值與自身實際位置不符
?*
?*??3、多個SeekBar同時滑動是因為AudioManager發生錯誤導致發出了多個不同StreamType類型的廣播,引起了其它進度條的更新
?*
?*??????通過直接判斷廣播發送的StreamType與當前實例的mStreamType是否一致來修復該問題。
?*?Turns?a?{@link?SeekBar}?into?a?volume?control.
?*?@hide
?*/
public?class?SeekBarVolumizer?implements?OnSeekBarChangeListener?Handler.Callback?{
????pri
評論
共有 條評論