Recherche…


Syntaxe

  • void setAudioStreamType (int streamtype)
  • void setDataSource (Contexte contextuel, Uri uri)
  • annuler préparer ()
  • annuler prepareAsync ()
  • départ nul ()
  • annuler l'annulation ()

Remarques

L'utilisation de MediaPlayer est principalement basée sur le diagramme d'état:

entrer la description de l'image ici

Cela signifie que pour jouer de l'audio / vidéo, une séquence d'action définie doit avoir lieu dans un ordre spécifique. Il indique également quelles actions peuvent être effectuées dans quel état .

L'API MediaPlayer manque de flexibilité (ajout d'un décodeur et d'une logique de rendu personnalisés) et ne prend pas en charge sSupport Dynamic Streaming Adaptative sur HTTP (SmashStreaming). Pour cela, regardez dans ExoPlayer .

Création de base et jeu

La classe MediaPlayer peut être utilisée pour contrôler la lecture des fichiers audio / vidéo et des flux.

La création de l'objet MediaPlayer peut être de trois types:

  1. Média de ressource locale

    MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource);
    mediaPlayer.start(); // no need to call prepare(); create() does that for you
    
  2. De l'URI local (obtenu à partir de ContentResolver)

    Uri myUri = ....; // initialize Uri here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(getApplicationContext(), myUri);
    mediaPlayer.prepare();
    mediaPlayer.start();
    
  3. À partir d'une URL externe

    String url = "http://........"; // your URL here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(url);
    mediaPlayer.prepare(); // might take long! (for buffering, etc)
    mediaPlayer.start();
    

Asynchrone préparer

Le MediaPlayer$prepare() est un appel bloquant qui gèle l'interface utilisateur jusqu'à la fin de l'exécution. Pour résoudre ce problème, MediaPlayer$prepareAsync() peut être utilisé.

mMediaPlayer = ... // Initialize it here
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer player) {
        // Called when the MediaPlayer is ready to play
        mMediaPlayer.start();
    }
}); // Set callback for when prepareAsync() finishes
mMediaPlayer.prepareAsync(); // Prepare asynchronously to not block the Main Thread

Sur les opérations synchrones, les erreurs sont normalement signalées par une exception ou un code d'erreur, mais chaque fois que vous utilisez des ressources asynchrones, vous devez vous assurer que votre application est correctement informée des erreurs. Pour MediaPlayer,

mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener(){
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            // ... react appropriately ...
            // The MediaPlayer has moved to the Error state, must be reset!
            // Then return true if the error has been handled
        }
});

Obtenir des sonneries système

Cet exemple montre comment récupérer l'URI des sonneries système ( RingtoneManager.TYPE_RINGTONE ):

private List<Uri> loadLocalRingtonesUris() {
        List<Uri> alarms = new ArrayList<>();
        try {
            RingtoneManager ringtoneMgr = new RingtoneManager(getActivity());
            ringtoneMgr.setType(RingtoneManager.TYPE_RINGTONE);

            Cursor alarmsCursor = ringtoneMgr.getCursor();
            int alarmsCount = alarmsCursor.getCount();
            if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) {
                alarmsCursor.close();
                return null;
            }

            while (!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
                int currentPosition = alarmsCursor.getPosition();
                alarms.add(ringtoneMgr.getRingtoneUri(currentPosition));
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return alarms;
    }

La liste dépend des types de sonneries demandés. Les possibilités sont les suivantes:

  • RingtoneManager.TYPE_RINGTONE
  • RingtoneManager.TYPE_NOTIFICATION
  • RingtoneManager.TYPE_ALARM
  • RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM


Pour obtenir les sonneries comme android.media.Ringtone chaque Uri doit être résolu par le RingtoneManager :

android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);

Pour jouer le son, utilisez la méthode:

public void setDataSource(Context context, Uri uri)

depuis android.media.MediaPlayer . MediaPlayer doit être initialisé et préparé conformément au diagramme d'état

Obtenir et définir le volume du système

Types de flux audio

Il existe différents profils de flux de sonnerie. Chacun d'eux a son volume différent.

Chaque exemple ici est écrit pour le type de flux AudioManager.STREAM_RING . Cependant, ce n'est pas le seul. Les types de flux disponibles sont les suivants:

  • STREAM_ALARM
  • STREAM_DTMF
  • STREAM_MUSIC
  • STREAM_NOTIFICATION
  • STREAM_RING
  • STREAM_SYSTEM
  • STREAM_VOICE_CALL


Réglage du volume

Pour obtenir le volume du profil spécifique, appelez:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);

Cette valeur est très peu utile lorsque la valeur maximale du flux n'est pas connue:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

Le rapport de ces deux valeurs donnera un volume relatif (0 <volume <1):

float volume = ((float) currentVolume) / streamMaxVolume


Réglage du volume d'un pas

Pour augmenter le volume du flux d'un pas, appelez:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);

Pour réduire le volume du flux d'un pas, appelez:

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);


Définition de MediaPlayer pour utiliser un type de flux spécifique

Pour ce faire, il existe une fonction d'assistance de la classe MediaPlayer .
Appelez simplement void setAudioStreamType(int streamtype) :

MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);

Media Player avec progression de la mémoire tampon et position de lecture

public class SoundActivity extends Activity  {
 
    private MediaPlayer mediaPlayer;
    ProgressBar progress_bar;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tool_sound);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        progress_bar = (ProgressBar) findViewById(R.id.progress_bar);
   
        btn_play_stop.setEnabled(false);
        btn_play_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                    btn_play_stop.setImageResource(R.drawable.ic_pause_black_24dp);
                } else {
                    mediaPlayer.start();
                    btn_play_stop.setImageResource(R.drawable.ic_play_arrow_black_24px);
                }
            }
        });

        mediaPlayer.setDataSource(proxyUrl);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                observer.stop();
                progress_bar.setProgress(mp.getCurrentPosition());
                // TODO Auto-generated method stub
                mediaPlayer.stop();
                mediaPlayer.reset();
            }
        });
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                progress_bar.setSecondaryProgress(percent);
            }
        });
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                btn_play_stop.setEnabled(true);

            }
        });
        observer = new MediaObserver();
        mediaPlayer.prepare();
        mediaPlayer.start();
        new Thread(observer).start();
    }

   
    private MediaObserver observer = null;

    private class MediaObserver implements Runnable {
        private AtomicBoolean stop = new AtomicBoolean(false);

        public void stop() {
            stop.set(true);
        }

        @Override
        public void run() {
            while (!stop.get()) {
                progress_bar.setProgress((int)((double)mediaPlayer.getCurrentPosition() / (double)mediaPlayer.getDuration()*100));
                try {
                    Thread.sleep(200);
                } catch (Exception ex) {
                    Logger.log(ToolSoundActivity.this, ex);
                }

            }
        }
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mediaPlayer.stop();
    }
}

<LinearLayout
    android:gravity="bottom"
    android:layout_gravity="bottom"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:weightSum="1">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageButton
            app:srcCompat="@drawable/ic_play_arrow_black_24px"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/btn_play_stop" />

        <ProgressBar
            android:padding="8dp"
            android:progress="0"
            android:id="@+id/progress_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

    </LinearLayout>

</LinearLayout>

Importer de l'audio dans androidstudio et le lire

Voici un exemple pour obtenir un fichier audio que vous avez déjà sur votre PC / ordinateur portable. Créez d'abord un nouveau répertoire sous res et nommez-le comme tel

ce

Copiez le fichier audio que vous souhaitez lire dans ce dossier. Il peut s'agir d'un fichier .mp3 ou .wav.

Maintenant, par exemple sur le clic sur le bouton, vous voulez jouer ce son, voici comment cela se fait

public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.aboutapp_activity);

    MediaPlayer song=MediaPlayer.create(this, R.raw.song);

    Button button=(Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           song.start();
        }
    });
}
}

Ceci jouera la chanson seulement une fois quand le bouton est cliqué, si vous voulez rejouer la chanson à chaque bouton cliquez écrivez le code comme ceci

 public class MainActivity extends AppCompatActivity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.aboutapp_activity);

   MediaPlayer song=MediaPlayer.create(this, R.raw.song);

   Button button=(Button)findViewById(R.id.button);
   button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (song.isPlaying()) {
            song.reset();
            song= MediaPlayer.create(getApplicationContext(), R.raw.song);
       }
         song.start();
     }
   });
 }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow