Lecture de fichiers audio sous Android

La dernière fois, nous avons parlé de la façon d'enregistrer un fichier audio. Cette fois, nous allons parler de la façon de lire un fichier audio. Enregistrez de l'audio, généralement nous l'utiliserons lors de l'envoi de voix dans le chat ou du téléchargement de voix. Étant donné que l'enregistrement est requis, il doit avoir une fonction de lecture. En même temps, nous jouons de l'audio et la musique doit également être lue. Alors aujourd'hui, je vais parler de la fonction de lecture audio.

1. Introduction à Media Player MediaPlayer

Puisqu'il lit de l'audio, MediaPlayer est utilisé. MediaPlayer est le lecteur audio et vidéo fourni avec Android. Il peut être utilisé pour lire des fichiers multimédias enregistrés par MediaRecorder, notamment amr, aac, mp4, 3gp, ainsi que des fichiers audio tels que mp3, wav, mid, ogg et mkv , mov, avi, etc. Fichiers vidéo.

2. Méthodes courantes de MediaPlayer (courantes pour la diffusion et la projection)

  • reset: réinitialisez le lecteur.
  • préparer: prêt à jouer.
  • start: commencer à jouer
  • pause: interrompre la lecture.
  • stop: arrête de jouer.
  • setOnPreparedListener: définit l'auditeur à lire. Besoin d'implémenter la méthode onPrepared de l'interface MediaPlayer.OnPreparedListener.
  • setOnCompletionListener: définit l'écouteur de fin de lecture. Besoin d'implémenter la méthode onCompletion de l'interface MediaPlayer.OnCompletionListener.
  • setOnSeekCompleteListener: définit l'écouteur de glissement de lecture. Besoin d'implémenter la méthode onSeekComplete de l'interface MediaPlayer.OnSeekCompleteListener.
  • create: crée un lecteur avec l'URI spécifié.
  • setDataSource: définissez le chemin du fichier de la source de données de lecture. Une seule des deux méthodes create et setDataSource doit être appelée.
  • setVolume: règle le volume. Les deux paramètres sont le volume du canal gauche et du canal droit, avec une valeur comprise entre 0 et 1.
  • setAudioStreamType: définissez le type de flux audio. Voir le tableau 1 pour la description de la valeur du type de flux audio.
Tableau 1

Type de sonnerie de la classe AudioManager

Nom de la sonnerie La description
STREAM_VOICE_CALL Tonalité d'appel  
STREAM_SYSTEM Tonalité système  
STREAM_RING Tonalité de sonnerie Sonneries pour les appels entrants et les messages texte
STREAM_MUSIC Son multimédia Son, vidéo, jeu, etc.
STREAM_ALARM Sonnerie d'alarme  
STREAM_NOTIFICATION Tonalité de notification  
  • setLooping: définissez s'il faut lire en boucle. true signifie jouer en boucle, false signifie ne jouer qu'une seule fois.
  • isPlaying: déterminez s'il est en cours de lecture.
  • seekTo: faites glisser la progression de la lecture vers la position spécifiée. Cette méthode peut être utilisée en conjonction avec la barre de glissement SeekBar.
  • getCurrentPosition: Obtenez la position de la progression de la lecture actuelle.
  • getDuration: obtenez la durée de lecture, en millisecondes.

3. Exemple de code

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

        <ProgressBar
            android:id="@+id/pro_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/bt_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始" />

        <Button
            android:id="@+id/bt_pause"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="暂停" />
    </LinearLayout>
</RelativeLayout>

MainActivity.java

public class MainActivity extends WaterPermissionActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {

    private String voicePath;
    private ProgressBar pro_bar;
    private Button bt_start;
    private Button bt_pause;
    private MediaPlayer mMediaPlayer;
    private Handler mHandler;
    private boolean isComplete = true;//是否完成

    @Override
    protected MvcBaseModel getModelImp() {
        return null;
    }

    @Override
    protected int getContentLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initWidget() {
        pro_bar = findViewById(R.id.pro_bar);
        bt_start = findViewById(R.id.bt_start);
        bt_pause = findViewById(R.id.bt_pause);
        bt_start.setOnClickListener(this);
        bt_pause.setOnClickListener(this);
        requestPermission(WRITE_EXTERNAL_STORAGE);
    }

    @Override
    protected void doSDWrite() {
        requestPermission(READ_EXTERNAL_STORAGE);
    }

    @Override
    protected void doSDRead() {
        //初始化音源路径
        getPath();
        //初始化媒体播放器
        init();
    }

    /**
     * 录制前创建一个空文件并获取路径
     */
    private void getPath() {
        List<String> list = new ArrayList<>();
        list.add("record");
        String dirPath = PathGetUtil.getLongwayPath(this, list);
        File fileVoice = new File(dirPath, "voice1616667408548.amr");
        voicePath = fileVoice.getPath();
    }

    /**
     * 初始化MediaPlayer
     */
    private void init() {
        mHandler = new Handler();
        mMediaPlayer = new MediaPlayer();//创建一个媒体播放器
        mMediaPlayer.setOnCompletionListener(this);//设置媒体播放器的播放完成监听器
        //定时器
        mHandler.postDelayed(r, 100);//延时100毫秒
    }

    /**
     * 播放音频
     */
    private void play() {
        try {
            isComplete = false;
            //重置媒体播放器
            mMediaPlayer.reset();
            //设置音频类型为音乐
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //设置媒体数据的文件路径
            mMediaPlayer.setDataSource(voicePath);
            //媒体播放器准备就绪
            mMediaPlayer.prepare();
            //媒体播放器开始播放
            mMediaPlayer.start();
            //设置进度条
            pro_bar.setMax(mMediaPlayer.getDuration());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_start:
                if (pro_bar.getProgress()!=0) {
                    //暂停开始
                    mMediaPlayer.start();
                } else {
                    //普通开始
                    play();
                }
                break;
            case R.id.bt_pause:
                if (mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                }
                break;
        }
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        isComplete = true;
        ToastUtil.toastWord(this, "播放完成");
    }

    private Runnable r = new Runnable() {
        @Override
        public void run() {
            if (mHandler != null) {
                if (isComplete) {
                    pro_bar.setProgress(0);
                } else {
                    pro_bar.setProgress(mMediaPlayer.getCurrentPosition());
                }
                mHandler.postDelayed(this, 500);
            }
        }
    };
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_38322371/article/details/115234871
conseillé
Classement