Исключение нулевого указателя видеопроигрывателя с использованием Google Media Framework Exoplayer

Я использую пример GMF для воспроизведения видео в своем приложении, где я загружаю видео заголовок и URL-адрес из живого JSON, вот пример моего JSON:

{
"videos": [ 
{
"title":"Video 1",
"url":"88.mp4"
},
{
"title":"Video 2",
"url":"l5.mp4"
}
]}

И вот как выглядит мой код:

MainActivity.java:

  JSONObject jsono = new JSONObject(data);
  JSONArray jarray = jsono.getJSONArray("videos");

  for (int i = 0; i < jarray.length(); i++) {
       JSONObject object = jarray.getJSONObject(i);

       Videos video = new Videos();

       video.setTitle(object.getString("title"));
       video.setUrl(object.getString("url"));

       videosArrayList.add(video);
   }

Всякий раз, когда я нажимаю на любой элемент списка для воспроизведения видео, получаю NPE, см. полный журнал:

03-17 13:14:34.667 18799-18799/com.google.googlemediaframeworkdemo.demo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.google.googlemediaframeworkdemo.demo, PID: 18799
java.lang.NullPointerException
at com.google.android.libraries.mediaframework.exoplayerextensions.RendererBuilderFactory.createRendererBuilder(RendererBuilderFactory.java:34)
at com.google.android.libraries.mediaframework.layeredvideo.LayerManager.<init>(LayerManager.java:78)
at com.google.android.libraries.mediaframework.layeredvideo.SimpleVideoPlayer.<init>(SimpleVideoPlayer.java:112)
at com.google.android.libraries.mediaframework.layeredvideo.SimpleVideoPlayer.<init>(SimpleVideoPlayer.java:81)
at com.google.googlemediaframeworkdemo.demo.adplayer.ImaPlayer.<init>(ImaPlayer.java:388)
at com.google.googlemediaframeworkdemo.demo.adplayer.ImaPlayer.<init>(ImaPlayer.java:434)
at com.google.googlemediaframeworkdemo.demo.adplayer.ImaPlayer.<init>(ImaPlayer.java:467)
at com.google.googlemediaframeworkdemo.demo.MainActivity$1.onItemClick(MainActivity.java:81)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1152)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3014)
at android.widget.AbsListView$3.run(AbsListView.java:3865)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
at dalvik.system.NativeStart.main(Native Method)
03-17 13:14:34.803 18799-18861/com.google.googlemediaframeworkdemo.demo D/dalvikvm: threadid=17: interp stack at 0x56eb0000
03-17 13:14:34.803 18799-18861/com.google.googlemediaframeworkdemo.demo D/dalvikvm: init ref table
03-17 13:14:34.803 18799-18861/com.google.googlemediaframeworkdemo.demo D/dalvikvm: init mutex
03-17 13:14:34.903 18799-18861/com.google.googlemediaframeworkdemo.demo D/MediatekClassFactory: createInstance(): Begin = 9861250
03-17 13:14:34.904 18799-18861/com.google.googlemediaframeworkdemo.demo D/MediatekClassFactory: create Instance with :  interface com.mediatek.common.telephony.IOnlyOwnerSimSupport
03-17 13:14:34.912 18799-18861/com.google.googlemediaframeworkdemo.demo W/MediatekClassFactory: Tablet not exist!, Get obj from default class
03-17 13:14:34.916 18799-18861/com.google.googlemediaframeworkdemo.demo D/MediatekClassFactory: create Instance from tablet library :  com.mediatek.tb.telephony.OnlyOwnerSimSupport
03-17 13:14:34.920 18799-18861/com.google.googlemediaframeworkdemo.demo D/MediatekClassFactory: createInstance(): End = 9861267

Я написал код таким, каким, по моему мнению, он должен быть, так что могу ли я узнать, где я пропустил? что мне не хватает? и как я могу это решить?


person Sophie    schedule 17.03.2016    source источник


Ответы (2)


В этой части кода

Videos video = new Videos();

video.setTitle(object.getString("title"));
video.setUrl(object.getString("url"));

videosArrayList.add(video);

вы никогда не назначаете поле video в Videos объекте video (никогда не вызываете public void setVideo(Video video) { this.video = video; }). Вы используете конструктор по умолчанию public Videos() { }, который инициализирует поле video значением null.

Чтобы решить эту проблему, добавьте эту строку

video.setVideo(new Video(object.getString("url"),VideoType.MP4)))
person Radu Ionescu    schedule 17.03.2016
comment
Точно то же самое я объяснил тебе, Софи, но, может быть, ты не поняла мой ответ. Хорошего дня :) - person Ivan Ivanov; 17.03.2016
comment
что, если я хочу воспроизводить видео по умолчанию, когда я нажимаю на элемент списка, например, я все еще нажимаю на элемент списка › тогда мне нужно нажать кнопку «Воспроизвести» в видеоплеере... теперь я хочу, чтобы каждый раз, когда пользователь нажимал на список Элемент, затем воспроизводить видео, не нужно показывать кнопку «Воспроизвести», чтобы воспроизвести видео... - person Sophie; 18.03.2016
comment
Разве ты не делаешь это уже здесь public void onItemClick(... imaPlayer.play(); ... ? - person Radu Ionescu; 18.03.2016

Когда вы получаете ответ в своем методе doInBackgroud, вы создаете объекты Videos и помещаете в них заголовок и URL-адрес, но когда вы создаете свой проигрыватель, вы пытаетесь получить объект Video при вызове videosArrayList.get(i).getVideo(), но он никогда не устанавливается. В этой точке находится ваше исключение NullPointerException.

person Ivan Ivanov    schedule 17.03.2016
comment
да, я не понял вашего ответа, но в любом случае я отметил ваш ответ как полезный... спасибо - person Sophie; 18.03.2016