Java MediaPlayer + Ionic Vue WebView Crash

Hello everybody,

I’m using the Java media player and trying to make a perfect loop (seamless). However when I go back to this topic Gappless sound loop on Android.. And what to do about it. | by @ViksaaSkool | Medium and change some details to make it match with Ionic I have something like 5 to 10 loop ok then the app crashes.

An idea ?

Error: Media Player Renderer process crash detected code 6
A/chromium: [FATAL:crashpad_client_linux.cc(667)] Render process (30757)'s crash wasn’t handled by all associated webviews, triggering application crash.

/**
 * Prepare the media player to be playing
 * @param url
 * @param loop
 */
private void PerfectLoopMediaPlayer(String url, Boolean loop) {
    Log.i(TAG, "url: "+url);
    mPath = url;
    try {
        Log.i(TAG, "===Perfect Loop MediaPlayer===");
        // mCurrentPlayer = new MediaPlayer();
        mCurrentPlayer.setDataSource(mPath);
        mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                try {
                    if(!mCurrentPlayer.isPlaying()) {
                        mCurrentPlayer.start();
                    }
                } catch (Exception e) {
                    Log.d("Error", "onPrepared 1: "+e.getMessage());
                }
            }
        });

        // Successful invoke of this method in a valid state transfers the object to the Preparing state. Calling this method in an invalid state throws an IllegalStateException.
        mCurrentPlayer.prepareAsync();
        createNextMediaPlayerPath();
    } catch (Exception e) {
        Log.d("Error", "PerfectLoopMediaPlayer: "+e.getMessage());
        e.printStackTrace();
    }
}

/**
 * Create the next media player to follow the end of the first
 * Android: Interface definition for a callback to be invoked when the media source is ready for playback
 */
private void createNextMediaPlayerPath() {
    mNextPlayer = new MediaPlayer();
    try {
        mNextPlayer.setDataSource(mPath);
        mNextPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                try {
                    mNextPlayer.seekTo(0);
                    mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
                    mCurrentPlayer.setOnCompletionListener(onCompletionListener);
                } catch (Exception e) {
                    Log.d("Error", "onPrepared 2: "+e.getMessage());
                }
            }
        });

        // Successful invoke of this method in a valid state transfers the object to the Preparing state. Calling this method in an invalid state throws an IllegalStateException.
        mNextPlayer.prepareAsync();
    } catch (IOException e) {
        Log.d("Error", "createNextMediaPlayerPath: "+e.getMessage());
        e.printStackTrace();
    }

}

/**
 * Play the second audio
 * Android: Interface definition for a callback to be invoked when playback of a media source has completed
 */
private final MediaPlayer.OnCompletionListener onCompletionListener =
        new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                try {
                     mCurrentPlayer = mNextPlayer;
                    createNextMediaPlayerPath();
                    // After release, the object is no longer available.
                    mediaPlayer.release();

                    Log.d(TAG, String.format("Loop #%d", ++mCounterLoop));
                } catch (Exception e) {
                    Log.d("Error", "onCompletion: "+e.getMessage());
                }
            }
        };