問題描述
設備連接otg外設音響,或者bt設備,進入設置界面,設置ring seekbar後,再設置media seekbar後,ring seekbar會異常變動。
原因分析
調整seekbar會播放提示音,由於連接了外部設置,會觸發AudioService 發送廣播
private void observeDevicesForStreams(int skipStream) {
synchronized (VolumeStreamState.class) {
for (int stream = 0; stream < mStreamStates.length; stream++) {
if (stream != skipStream) {
mStreamStates[stream].observeDevicesForStream_syncVSS(false /*checkOthers*/);
}
}
}
}
public int observeDevicesForStream_syncVSS(boolean checkOthers) {
final int devices = AudioSystem.getDevicesForStream(mStreamType);
if (devices == mObservedDevices) {
return devices;
}
final int prevDevices = mObservedDevices;
mObservedDevices = devices;
if (checkOthers) {
// one stream's devices have changed, check the others
observeDevicesForStreams(mStreamType);
}
// log base stream changes to the event log
if (mStreamVolumeAlias[mStreamType] == mStreamType) {
EventLogTags.writeStreamDevicesChanged(mStreamType, prevDevices, devices);
}
sendBroadcastToAll(mStreamDevicesChanged
.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_DEVICES, prevDevices)
.putExtra(AudioManager.EXTRA_VOLUME_STREAM_DEVICES, devices));
return devices;
}
而framework SeekBarVolumizer.java 中註冊監聽這個廣播,對這個廣播邏輯處理有問題。
修改方案
代碼用添加判斷
} else if (AudioManager.STREAM_DEVICES_CHANGED_ACTION.equals(action)) {
int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
int streamVolume = mAudioManager.getStreamVolume(streamType);
/*meig:jicong.wang modify for bug P_RS51_E-629 start {@*/
if (streamType==mStreamType) {
updateVolumeSlider(streamType, streamVolume);
}
/*meig:jicong.wang modify for bug P_RS51_E-629 end @}*/