4

I am trying to implement a video player for android tv(sdk 26). The default project template uses MediaPlayerGlue for playback control, and can play videos from remote sources (via http).

private MediaPlayerGlue mTransportControlGlue;
...
mTransportControlGlue = new MediaPlayerGlue(getContext());

mTransportControlGlue.setMode(MediaPlayerGlue.NO_REPEAT);
mTransportControlGlue.setHost(glueHost);
mTransportControlGlue.setTitle(movie.getTitle());
mTransportControlGlue.addPlayerCallback(
        new PlaybackGlue.PlayerCallback() {
            @Override
            public void onPreparedStateChanged(PlaybackGlue glue) {
                if (glue.isPrepared()) {
                    glue.play();
                }
            }
        });
mTransportControlGlue.setVideoUrl(movie.getVideoUrl());

But the limitation for this boilerplate code is- it doesnot support seekbar. To be able to use seekbar, I changed my glue to be PlaybackTransportControlGlue-

private PlaybackTransportControlGlue mTransportControlGlue;
....
MediaPlayerAdapter playerAdapter = new MediaPlayerAdapter(getContext());
playerAdapter.setDataSource(Uri.parse(movie.getVideoUrl()));
mTransportControlGlue = new PlaybackTransportControlGlue(getContext(), playerAdapter);

mTransportControlGlue.setHost(glueHost);
mTransportControlGlue.setTitle(movie.getTitle());
mTransportControlGlue.addPlayerCallback(
        new PlaybackGlue.PlayerCallback() {
            @Override
            public void onPreparedStateChanged(PlaybackGlue glue) {
                if (glue.isPrepared()) {
                    glue.play();
                }
            }
        });

There are three differences in those two implementations-

  1. MediaPlayerGlue vs PlaybackTransportControlGlue,

  2. MediaPlayerGlue did not need an adapter provided, but PlaybackTransportControlGlue does

  3. In first snippent We specified the video url as string into glue, whereas in PlayBackTransportControlGlue, we specified the url as URI into the adapter, because no overload takes string.

Now the problem is, the first implementation works but the second one does not. It gives a warning-

W/MediaPlayer:
 Couldn't open file on client side; trying server side: java.io.FileNotFoundException:
 No content provider: http://example.com/sdj1/english-movies3/2017//A%20Mermaid's%20Tale%20(2016)%20DVDRip//A%20Mermaid's%20Tale%20(2016)%20DVDRip.avi

And then throws exception-

 java.lang.NullPointerException:
Attempt to invoke virtual method
'void android.support.v17.leanback.media.PlayerAdapter$Callback.onBufferingStateChanged(android.support.v17.leanback.media.PlayerAdapter, boolean)' on a null object reference
   at android.support.v17.leanback.media.MediaPlayerAdapter.notifyBufferingStartEnd(MediaPlayerAdapter.java:129)
   at android.support.v17.leanback.media.MediaPlayerAdapter.prepareMediaForPlaying(MediaPlayerAdapter.java:362)
   at android.support.v17.leanback.media.MediaPlayerAdapter.setDataSource(MediaPlayerAdapter.java:338)
at com.example.ftptest.CustomPlaybackVideoFragment.onCreate(CustomPlaybackVideoFragment.java:47)

The url is valid and hitting it on browser does play the video. Also I tried with different formats (avi, mp4), same result.

Any ideas how I can get my second implementation working?

user9510058
  • 321
  • 1
  • 8

0 Answers0