2013-04-23 126 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%