2017-07-19 61 views
7

我正在實施VolumeProvider,但我不知道我應該將我的播放器設置爲什麼音量,一旦onAdjustVolume被調用。它給我的只是方向。現在我正在使用getCurrentVolume() + direction,但只有在步驟等於AudioManager.ADJUST_LOWERAudioManager.ADJUST_RAISEAudioManager.ADJUST_SAME時纔有效。VolumeProvider的onAdjustVolume上的步驟有多大?

那麼我怎麼能知道這些步驟是什麼?

謝謝。

編輯:我創建了一個示例來顯示與@auval響應的問題。

public class MainActivity extends AppCompatActivity { 
    private String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final ProgressBar volumeBar = (ProgressBar) findViewById(R.id.progress); 
     final VolumeProviderCompat volumeProviderCompat = new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, 100, 100) { 
      @Override 
      public void onAdjustVolume(int direction) { 
       Log.i(TAG, "onAdjustVolume " + direction); 
       if (direction > 0) { 
        setCurrentVolume(getCurrentVolume() + 5); 
       } else if (direction < 0) { 
        setCurrentVolume(getCurrentVolume() - 5); 
       } 
      } 

      @Override 
      public void onSetVolumeTo(int volume) { 
       super.onSetVolumeTo(volume); 
       Log.i(TAG, "onSetVolumeTo " + volume); 
      } 
     }; 
     volumeProviderCompat.setCallback(new VolumeProviderCompat.Callback() { 
      @Override 
      public void onVolumeChanged(VolumeProviderCompat volumeProvider) { 
       volumeBar.setMax(volumeProvider.getMaxVolume()); 
       int currentVolume = volumeProvider.getCurrentVolume(); 
       Log.i(TAG,"onVolumeChanged " + currentVolume); 
       volumeBar.setProgress(currentVolume); 
      } 
     }); 
     final MediaSessionCompat test = new MediaSessionCompat(this, "Test"); 
     PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder(); 
     stateBuilder.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_REWIND | PlaybackState.ACTION_FAST_FORWARD); 
     stateBuilder.setState(PlaybackState.STATE_PLAYING, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 1.0f); 
     test.setPlaybackState(stateBuilder.build()); 
     test.setActive(true); 
     test.setPlaybackToRemote(volumeProviderCompat); 
    } 
} 

這是在屏幕上會發生什麼:

enter image description here

回答

4

這是更好地使用VolumeProviderCompat,因爲VolumeProvider需要21

  1. 最低SDK這是你來決定有多少您想要提供的音量步驟。
  2. 用這個數字除以最大音量,它會給你每一步調整的值。
    • 例如,最大容積爲100,則決定提供5個步驟==>每個步驟將由20
  3. 改變音量相應地調整音量。
    • 例如,當前的音量是40,你有量可達事件==>你現在需要將音量設置爲60

順便說一句,沒有在規範中指出,音量控制必須是線性的,你可以決定以小間隔變化開始,並增加每個連續音量按下跳躍...

+0

你是說我是一個控制步長?按下音量按鈕時顯示的面板是否已經具有使用的步長? – casolorz

+0

是的,你在控制。沒有預先定義的「步驟」 - 您通過將當前位置轉換爲下一個位置來定義它們,這是音量提高事件的結果。 UI知道把槓桿放在哪裏,以你設定的值和最大值的百分比 – auval

+0

對不起,我想我只是不理解。我想這是你告訴我要做的。覆蓋'onAdjustVolume()'。然後在裏面用'getCurrentVolume()+ - step'調用'setCurrentVolume()'我自己,但是當我這樣做時,雖然這一步工作正常,但手機面板首先顯示一個微小的步驟,然後基於我的步驟。 – casolorz