关于android:Android入门教程-Android-MediaPlayer-播放音频

72次阅读

共计 5569 个字符,预计需要花费 14 分钟才能阅读完成。

MediaPlayer 的应用形式

创立 MediaPlayer

能够间接 new MediaPlayer,也能够用 MediaPlayer 提供的 create 办法创立。

mediaPlayer = new MediaPlayer();

应用 create 办法创立胜利后,mediaPlayer 处于 Prepared 状态。能够间接 start 播放。

    mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));
    mediaPlayer.start();

设置音源 – setDataSource

通过调用 setDataSource 来设置音源。setDataSource 有多个重载办法,咱们来看罕用的几种。

例如设置应用 assets 里的资源。理论状况可能须要 try catch。

    AssetFileDescriptor fd = null;
    MediaPlayer mediaPlayer = new MediaPlayer();
    fd = context.getApplicationContext().getAssets().openFd(name);
    mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

本地文件,须要文件的绝对路径。

mediaPlayer.setDataSource(file.getAbsolutePath());

或者获取文件的 Uri 来创立 mediaPlayer。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));

设置网络音频,也是用 setDataSource 办法,设置 url。

mediaPlayer.setDataSource("https://demo.com/sample.mp3"));

播放网络音频时,如果应用的是 http,有可能会报错

java.io.IOException: Cleartext HTTP traffic to demo.com not permitted

能够简略地设置一下 manifest,设置 usesCleartextTraffic=”true”

<application
        android:usesCleartextTraffic="true">

筹备 – prepare

同步和异步筹备音频资源。prepareAsync() 是异步的形式,prepare 是同步的。留神线程调度问题,同时不要阻塞 UI 线程。

应用异步形式筹备音频,常常与 MediaPlayer.OnPreparedListener 监听器配合应用。异步筹备时,也能够进行其余的设置。

    mediaPlayer.prepareAsync();
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {mediaPlayer.start(); // 筹备好了就播放
        }
    });

循环播放 – Looping

设置循环播放 setLooping。

mediaPlayer.setLooping(true);

播放结束后,不会回调 OnCompletionListener,而是从头播放以后音频。

播放 – start

播放音频,调用 start 办法。

mediaPlayer.start();

处于 Prepared,Pause 和 PlaybackComplete 状态时,能够调用 start 办法,进入 Started 状态。

暂停 – pause

暂停播放,应用 pause 办法。在暂停前先判断一下 mediaPlayer 的是否在播放。

    if (mediaPlayer.isPlaying()) {mediaPlayer.pause();
    }

暂停胜利则处于 Paused 状态。

进行 – stop

回顾一下 MediaPlayer 状态切换的图示,咱们能够得悉在播放中,暂停,播放实现这 3 个状态下,能够调用 stop 办法,进入 Stopped 状态。

mediaPlayer.stop();

调进度 – seekTo

调整播放进度。咱们平时应用音乐播放软件个别都会有这个性能。seekTo 办法承受一个毫秒参数。

    int targetMS = (int) (percent * mediaPlayer.getDuration());
    mediaPlayer.seekTo(targetMS);

seekTo 并不会扭转 MediaPlayer 的状态。

重置 – reset

reset 后的 mediaPlayer 进入 Idle 状态。须要从新设置音源与筹备。

开释 – release

不再应用这个 mediaPlayer 时,该当尽快开释掉,以开释相干的资源。调用 release 后,mediaPlayer 进入 End 状态。此时这个 mediaPlayer 就不能再应用了。

罕用监听器

缓冲监听器 OnBufferingUpdateListener

比方咱们加载网络音频的时候,罕用这个监听器来监听缓冲进度。显示缓冲进度,也能够进步用户体验。

    mMediaPlayer.prepareAsync();
    mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
        @Override
        public void onBufferingUpdate(MediaPlayer mp, int percent) {// percent 代表缓冲百分比}
    });

谬误监听器 OnErrorListener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {return true; // 返回 true 示意在此处理错误,不会回调 onCompletion}
});

留神 onError 的返回值。能够抉择本人解决 error。

         * @return True if the method handled the error, false if it didn't.
         * Returning false, or not having an OnErrorListener at all, will
         * cause the OnCompletionListener to be called.
         */
        boolean onError(MediaPlayer mp, int what, int extra);

播放结束监听器 OnCompletionListener

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {// 播放结束}
});

应用示例

播放 assets 里的音频

播放 assets 里的音频文件,应用到 AssetFileDescriptor 类。应用后记得敞开 AssetFileDescriptor。

    private void playAssetsAudio(final String name, Context context) {Log.d(TAG, "playAssetWordSound: try to play assets sound file. ->" + name);
        AssetFileDescriptor fd = null;
        try {
            MediaPlayer mediaPlayer;
            Log.v(TAG, "Looking in assets.");
            fd = context.getApplicationContext().getAssets().openFd(name);
            mediaPlayer = new MediaPlayer();
            mediaPlayer.reset();
            mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {Log.d(TAG, "onPrepared:" + name);
                    mediaPlayer.start();}
            });
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {mp.release();
                    Log.d(TAG, "onCompletion:" + name);
                }
            });
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int i, int i1) {mp.release();
                    return true;
                }
            });
        } catch (Exception e) {
            try {if (fd != null) {fd.close();
                }
            } catch (Exception e1) {Log.e(TAG, "Exception close fd:", e1);
            }
        } finally {if (fd != null) {
                try {fd.close();
                } catch (IOException e) {Log.e(TAG, "Finally, close fd", e);
                }
            }
        }
    }

播放本地音频文件

尝试播放音频文件。仅播放一次。

    private void playAudioFile(final File file) {Log.d(TAG, "playAudioFile:" + file.getAbsolutePath());
        MediaPlayer mediaPlayer;
        try {mediaPlayer = new MediaPlayer();
            mediaPlayer.setLooping(false);
            mediaPlayer.setDataSource(file.getAbsolutePath());
            mediaPlayer.prepare();
            mediaPlayer.start();
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {mp.release();
                }
            });
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {Log.d(TAG, "Play local sound onError:" + i + "," + i1);
                    return true;
                }
            });
        } catch (Exception e) {Log.e(TAG, "playAudioFile:", e);
        }
    }

播放在线音频

设置 url,播放在线音频

    private void playOnlineSound(String soundUrlDict) {
        try {MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(soundUrlDict);
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {mediaPlayer.start();
                }
            });
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {if (mp != null) {mp.release();
                    }
                    Log.d(TAG, "onCompletion: play sound.");
                }
            });
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {Log.d(TAG, "Play online sound onError:" + i + "," + i1);
                    return false;
                }
            });
        } catch (IOException e1) {Log.e(TAG, "url:", e1);
        }
    }

【Android 音视频开发系列教程】

正文完
 0