2013-04-23 130 views
1

在我的应用程序中我有一个VerticalSeekBar(一些自定义实现SeekBar)当用户使用硬件按钮更改媒体音量时进度应该改变。下面是使用半工作解决方案ContentObserverandroid - 检测流量变化

 public class SettingsContentObserver extends ContentObserver { 

    private VerticalSeekBar sb; 
    private AudioManager am; 

public SettingsContentObserver(Handler handler, VerticalSeekBar sb, AudioManager am) { 
    super(handler); 
    this.sb = sb; 
    this.am = am; 

} 

@Override 
public boolean deliverSelfNotifications() { 
    return super.deliverSelfNotifications(); 
} 

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    sb.setProgress(am.getStreamVolume(AudioManager.STREAM_MUSIC)); 

} 
    } 

活动:

 @Override 
protected void onResume() { 
    super.onResume(); 
    mSettingsContentObserver = new SettingsContentObserver(new Handler(), vBar, audioMan); 
    this.getApplicationContext().getContentResolver().registerContentObserver( 
     android.provider.Settings.System.CONTENT_URI, true, 
     mSettingsContentObserver); 

} 

问题:检测量的变化,但有几秒钟的延迟,直到他们得到检测和SeekBar的进步变化。

问题:是否有更可靠的方法来侦听特定卷流上的音量变化?请分享你的解决方案,如果你有一些

回答

3

我已经提出了一个解决方案,在通话时监视音量水平,所以这应该是类似的。

您可以侦听活动中的按键(onKey)并检查相应的keyCode(VOLUME_UP或VOLUME_DOWN)。

或者,如果你不能因为某些原因的关键事件监听(一些远程视图),只是轮询以足够快的频率音量:

  1. 使用am.getStreamVolume(AudioManager.STREAM_MUSIC)轮询音量。

  2. 以您想要的频率运行此功能。例如:

    private Runnable mVolumeUpdateRunnable = new Runnable() { 
        public void run() { 
         if (shouldUpdate) 
         { 
           updateCurrentVolume(); 
           new Handler().postDelayed(mVolumeUpdateRunnable, VOLUME_SAMPLING_DELAY); 
         } 
        } 
    }; 
    

电话是不昂贵,因此它不应该是在高频更新一个大问题。

0

轮询流量在高频率增加CPU使用率,在我的情况下它是14%