问题描述
设备连接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 @}*/