Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android MediaPlayer setNextMediaPlayer() alternative

I published an app recently, and users are reporting crashes because my program included the method setNextMediaPlayer(). I now realize that this only works for API 16+, and my app supports API 8+. I was wondering if there is an alternate way of achieving the same effect.

My app has some text to speech, and what I was doing was creating an ArrayList of MediaPlayers that each had a short sound file, and then playing them one after an other. If I remove this method from the code, the audio becomes too choppy to understand.

I was thinking about using the SoundPool class, but there is no OnCompleteListener, so I'm not sure how I would do it.

So basically my question is: Is there a way to transition seamlessly between audio files without using the setNextMediaPlayer() method?

Thanks very much for your time!

EDIT

I added this code that I found

    private class CompatMediaPlayer extends MediaPlayer implements OnCompletionListener {

    private boolean mCompatMode = true;
    private MediaPlayer mNextPlayer;
    private OnCompletionListener mCompletion;

    public CompatMediaPlayer() {
        try {
            MediaPlayer.class.getMethod("setNextMediaPlayer", MediaPlayer.class);
            mCompatMode = false;
        } catch (NoSuchMethodException e) {
            mCompatMode = true;
            super.setOnCompletionListener(this);
        }
    }

    public void setNextMediaPlayer(MediaPlayer next) {
        if (mCompatMode) {
            mNextPlayer = next;
        } else {
            super.setNextMediaPlayer(next);
        }
    }

    @Override
    public void setOnCompletionListener(OnCompletionListener listener) {
        if (mCompatMode) {
            mCompletion = listener;
        } else {
            super.setOnCompletionListener(listener);
        }
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        if (mNextPlayer != null) {
            // as it turns out, starting a new MediaPlayer on the completion
            // of a previous player ends up slightly overlapping the two
            // playbacks, so slightly delaying the start of the next player
            // gives a better user experience
            SystemClock.sleep(50);
            mNextPlayer.start();
        }
        mCompletion.onCompletion(this);
    }
}

But now how do I add the audio files? I tried this:

        // assigns a file to each media player
    mediaplayers = new ArrayList<CompatMediaPlayer>();
    for (int i = 0; i < files.size(); i++) {
        mediaplayers.add((CompatMediaPlayer) CompatMediaPlayer.create(this, files.get(i)));
    }

but am getting a class cast exception because MediaPlayer cannot be casted to CompatMediaPlayer.

like image 502
picklelo Avatar asked Aug 27 '13 14:08

picklelo


People also ask

What are the best Android alternatives to Windows Media Player?

Other interesting Android alternatives to Windows Media Player are foobar2000 (Free), MPV (Free, Open Source), AIMP (Free) and MediaMonkey (Freemium). The media player provided pre-installed with all modern Windows versions (7 and higher): Windows Media Player 12 plays more...

What is a media player for Android?

We found the best media player apps for Android! A media player is kind of a weird term these days. It’s a generic term for an app that plays media. However, there are people looking for apps that play both music and video in the same app in order to save space and time. This list is for those people.

How do I change the state of mediaplayer when preparing media?

When the MediaPlayer is done preparing, it enters the Prepared state, which means you can call start () to make it play the media. At that point, as the diagram illustrates, you can move between the Started, Paused and PlaybackCompleted states by calling such methods as start () , pause (), and seekTo () , amongst others.

What is the mediaplayer class?

One of the most important components of the media framework is the MediaPlayer class. An object of this class can fetch, decode, and play both audio and video with minimal setup. It supports several different media sources such as: For a list of media formats that Android supports, see the Supported Media Formats page.


1 Answers

Create Compat player that will work with onCompletionListener to start the next player like:

public void onCompletion(MediaPlayer mp) {
    if (mCompatMode && mNextPlayer != null) {
        mNextPlayer.prepare();
        mNextPlayer.start();
    }
}

Somewhere in your constructor check if there is method (or check SDK version) named "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

Define method like this one:

public void setNextMediaPlayer(MediaPlayer next) {
    if (mCompatMode) {
        mNextPlayer = next;
    } else {
        super.setNextMediaPlayer(next);
    }
}
like image 164
Nikola Despotoski Avatar answered Oct 13 '22 00:10

Nikola Despotoski