2013-04-23 2 views
1

내 앱 VerticalSeekBar (사용자 정의 구현은 SeekBar) 사용자가 하드웨어 버튼을 사용하여 미디어 볼륨을 변경하면 진행 상황이 변경되어야합니다. 다음은 사용 반 작업 솔루션 인 ContentObserver :android - 스트림 볼륨 변경 감지

 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

고주파수에서 폴링 스트림 볼륨이 증가합니다. 내 경우에는 14 %입니다.