The MediaPlayer
usage is mainly based on the State diagram:
That means that in order to play audio/video a defined sequence of action must occur is specific order. It also states what actions can be made in which state.
The MediaPlayer API lacks flexibility (adding custom decoder and rendering logic) and lacks sSupport for Dynamic Adaptive Streaming over HTTP (DASH) and SmoothStreaming. For these, look into ExoPlayer.