Comment gérer MediaPlayer.setVolume () + SeekBar pour le régler + contrôle du volume de l'appareil

Comme l'a recommandé le document , j'aimerais utiliser la méthode setvolume() pour contrôler le volume de mon MediaPlayer , mais je suis un peu confus quant à la façon de le gérer.

Je SeekBar le volume à l'aide d'un SeekBar , initialisé au volume actuel dans le flux AudioManager.STREAM_MUSIC .

Cela a du sens lorsque l'utilisateur ne modifie pas le contrôle du volume de l'appareil, mais quand il le fait, je ne suis pas sûr de ce que je devrais faire et j'ai plusieurs doutes:

  • Comment le volume MediaPlayer est-il lié au volume du périphérique? La valeur maximale (1) définie dans setVolume() correspond-elle à mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)

  • Si tel est le cas, la valeur de progression du SeekBar doit être réinitialisée chaque fois que le contrôle du volume de l'appareil est réglé, mais alors, quel est l'intérêt d'utiliser MediaPlayer.setVolume() au lieu de AudioManager.setStreamVolume () ?

  • Quelle est la façon standard d'utiliser MediaPlayer.setVolume() avec SeekBar ?

 private final static int MAX_VOLUME = 100; private AudioManager mAudioManager; private SeekBar mVolumeControl; mVolumeControl = (SeekBar) getActivity().findViewById(R.id.volume_control); mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); mVolumeControl.setMax(MAX_VOLUME); mVolumeControl.setProgress(MAX_VOLUME*mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)); mVolumeControl.setOnSeekBarChangeListener(mVolumeControlChangeListener); private SeekBar.OnSeekBarChangeListener mVolumeControlChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { float volume = (float) (1 - (Math.log(MAX_VOLUME - progress) / Math.log(MAX_VOLUME))); mediaPlayer.setVolume(volume, volume); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) { } }; 

  • Comment limiter la barre de recherche
  • Personnaliser seepobar enpoints
  • Remplir deux superpositions d'images comme la barre de recherche sur l'événement tactile de la vue d'image
  • Mettre à jour MusicPlayer SeekBar in Service
  • Écouteur Multiple SeekBars
  • Comment faire en sorte que SeekBar prenne toute la largeur du parent
  • Comment utiliser un Seekbar dans Android comme un SearchBar ainsi qu'un ProgressBar simultanément?
  • UI est-il coincé lorsque le clavier logiciel s'affiche alors que le lecteur multimédia joue?
  • 3 Solutions collect form web for “Comment gérer MediaPlayer.setVolume () + SeekBar pour le régler + contrôle du volume de l'appareil”

    MediaPlayer.setVolume définit le volume de ce joueur en pourcentage du volume global de ce flux. Cela n'affecte pas le volume du flux. Donc, si vous souhaitez définir uniquement le volume de ce joueur, définissez-le entre 0 et 1 (une valeur fractionnaire représentant le pourcentage) et laissez l'utilisateur contrôler le volume du système séparément en utilisant les contrôles du volume matériel. Pour brancher un SeekBar , vous pouvez l'échelle d'un facteur de 100 comme vous l'avez fait dans votre exemple de code, car SeekBar ne supporte pas les valeurs fractionnées. Oh, et une autre chose pour le bien-être des autres (puisque vous l'avez déjà compris): les docteurs disent que "les contrôles UI devraient être mis à l'échelle de manière logarithmique", ce qui signifie que si vous réglez simplement le volume sans mise à l'échelle, le contrôle du volume Ne se sent pas naturel. Fondamentalement, la réduction de moitié de l'amplitude de la vague n'est PAS perçue par l'oreille humaine comme "la moitié du volume", donc vous devez marcher de façon logarithmique pour que cela ressemble plus naturel à l'oreille humaine, comme vous l'avez fait dans votre exemple de code.

    Si vous souhaitez régler le volume du système pour le flux donné (et pas seulement pour le joueur donné), vous pouvez utiliser AudioManager.setStreamVolume avec une valeur entre 0 et la valeur retournée par AudioManager.getStreamMaxVolume . Mais gardez à l'esprit que celui-ci est généralement un contrôle de volume à faible résolution – getMaxStreamVolume renvoie généralement une valeur relativement faible – comme 10 ou 15, donc vous n'avez que quelques positions possibles pour le volume. Cela signifie que la commande du volume ne sera pas aussi douce que si vous contrôlez directement le volume du MediaPlayer. De plus, évidemment, régler le volume de cette façon le définit pour l'ensemble du système et affecte toutes les applications, ce qui peut ne pas être ce que l'utilisateur souhaite.

    Ajout de la réponse de TodorK.

    Ce que j'ai fait, c'est que j'ai initialement réglé StreamVolume à Max, et que l'utilisateur contrôle le SeekBar. Une fois qu'ils ont terminé, je retrouve le StreamVolume dans son état d'origine. Cela permet à l'utilisateur de contrôler le volume MediaPlayer et n'affecte pas d'autres applications.

    Préparez d'abord le flux à l'unité souhaitée et initialisez le Gestionnaire audio

     setVolumeControlStream(AudioManager.STREAM_MUSIC); audioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 

    Obtenez InitialVolume (afin que vous le réinitialiez une fois que vous avez fini) et réglez-le sur MaxVolume

     final int initVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); final int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,maxVolume, 0); 

    Effectuez l'AudioStuff dans la partie OnProgress du SeekBarChangedListener

      @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { float volume = (float) (1 - (Math.log(100 - progress) / Math.log(100))); mp.setVolume(volume, volume); mp.start(); } 

    Une fois que vous avez terminé, réglez-le sur le volume initial, de sorte que l'utilisateur ne soit pas énervé (dans mon cas, je suis en train d'utiliser un AlertDialog, donc c'est sur le sujet OnDismiss

      @Override public void onDismiss(DialogInterface dialog) { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,initVolume, 0); //Stop Playing the Song stopSong(); } 

    Aussi notez-moi, j'ai fait le journal dans la partie OnProgress

    Faites d'abord un fichier seekBar dans XML. Ensuite, copiez ce code ( seekBar2 est l'Id pour le SearchBar):

     private final static int MAX_VOLUME = 100; SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar2); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { float volume = (float) (1 - (Math.log(MAX_VOLUME - progress) / Math.log(MAX_VOLUME))); mediaPlayer.setVolume(volume, volume); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.