Android MediaPlayer play audio

This link: Android MediaPlayer play audio

It describes ways to use MediaPlayer to play audio. MediaPlayer on the basics, such as a state, can refer to the Android MediaPlayer basis for a brochure .

In order to facilitate the expression, the definition of a variable named mediaPlayer.

The use MediaPlayer

Create a MediaPlayer

Direct new MediaPlayer, you can create a method provided with MediaPlayer create.

mediaPlayer = new MediaPlayer();

Once created using the create method, mediaPlayer in Prepared state. You can directly start playing.

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

Set audio - setDataSource

By calling setDataSourceto set source. setDataSourceThere are multiple overloaded methods, we look at several commonly used.

Set in assets such as resource usage. Actual results may need to try catch.

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

Local file, you need absolute file path.

mediaPlayer.setDataSource(file.getAbsolutePath());

Or get Uri file to create mediaPlayer.

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

Network audio settings, but also with setDataSource method, set the url.

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

When playing audio network, if you are using http, there may be error

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

You can simply set it manifest, set usesCleartextTraffic = "true"

<application
        android:usesCleartextTraffic="true">

Prepare - prepare

Synchronous and asynchronous ready audio resources. prepareAsync () is an asynchronous manner, prepare synchronized. Note that thread scheduling problem, and do not block the UI thread.

Using asynchronous way to prepare audio, often used in conjunction with MediaPlayer.OnPreparedListener listener. Asynchronous ready, you can also make other settings.

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

Loop - Looping

Set loop setLooping.

mediaPlayer.setLooping(true);

After finished playing, not the callback OnCompletionListener, but played from the beginning of the current audio.

Play - start

Play audio, call the start method.

mediaPlayer.start();

While in Prepared, Pause and PlaybackComplete state, you can call the start method, enter the Started state.

Pause - pause

Pause playback, use the pause method. Before pause to determine what mediaPlayer whether the player.

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

Pause for success in the Paused state.

Stop - stop

Recall MediaPlayer state diagram for switching, we can see that in playback, pause, play the next complete these three states, you can call the stop method, enter the Stopped state.

mediaPlayer.stop();

Transfer progress - seekTo

Adjust the playback progress. We usually use the music player software generally has this feature.
The method accepts a parameter seekTo milliseconds.

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

seekTo does not change the state of the MediaPlayer.

Reset - reset

After the reset mediaPlayer into the Idle state. Need to re-set the source and preparation.

Release - release

When no longer use this mediaPlayer, it should be released as soon as possible out to release the associated resources.
After calling release, mediaPlayer enter End state. At this point the mediaPlayer no longer be used.

Common Listener

Buffer listener OnBufferingUpdateListener

For example, when we load the network audio, commonly used this listener to listen buffer progress. Show buffer progress, you can also improve the user experience.

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

Error Listener OnErrorListener

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

Note that the return value of onError. You can choose their own processing 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);

Finished playing listener OnCompletionListener

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

Examples of Use

Audio playback in assets

Play assets in the audio file, use the AssetFileDescriptor class. After use remember to turn off 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);
                }
            }
        }
    }

Playing local audio files

Try to play audio files. Play only once.

    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);
        }
    }

Play online audio

Setting url, online audio player

    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);
        }
    }

The code can refer to the example project: https://github.com/RustFisher/android-MediaPlayer

Guess you like

Origin www.cnblogs.com/rustfisher/p/11568524.html