No se puede reproducir este vídeo

Tengo un problema al intentar reproducir vídeos dentro de un ViewPager.

El problema parece bastante específico y no entiendo qué puede ser el problema.

He simplificado mi código a una aplicación muy simple que tiene un ViewPager y reproduce un video en cada página (los videos están en la tarjeta SD y la aplicación tiene los permisos adecuados). Y un botón para pasar a la página siguiente y la anterior.

Mi ViewPagerAdapter es:

new PagerAdapter() { @Override public int getCount() { return 7; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public Object instantiateItem(ViewGroup container, final int position) { View result= LayoutInflater.from(container.getContext()).inflate(R.layout.page,container,false); container.addView(result); VideoView videoView= (VideoView) result.findViewById(R.id.videoview); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); File file=new File("/sdcard/Vids/cat"+(position+1)+".webm"); videoView.setVideoURI(Uri.fromFile(file)); return result; } @Override public void destroyItem(ViewGroup container, int position, Object object) { View view = (View) object; container.removeView(view); } } 

Los botones:

  view.findViewById(R.id.button_prev).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewPager.setCurrentItem(viewPager.getCurrentItem()-1,true); } }); view.findViewById(R.id.button_next).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewPager.setCurrentItem(viewPager.getCurrentItem()+1,true); } } 

El diseño de cada página es simple:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <VideoView android:id="@+id/videoview" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

Cuando empiece a jugar con los botones siguientes / anteriores, aparecerá el problema:

  • El hilo principal se bloquea durante aproximadamente 1-2 segundos
  • Aparecerá un cuadro de diálogo que dice "No se puede reproducir este vídeo"
  • Varios errores aparecen en el logcat:

La salida logcat es:

 E/MediaPlayer: error (1, -2147479543) E/MediaPlayer: error (1, -2147479543) E/MediaPlayer: error (1, -38) E/MediaPlayer: error (1, -38) E/MediaPlayer: error (1, -2147479551) E/MediaPlayer: error (1, -38) E/MediaPlayer: error (1, -2147479543) I/Choreographer: Skipped 182 frames! The application may be doing too much work on its main thread. E/MediaPlayer: Error (1,-2147479543) D/VideoView: Error: 1,-2147479543 E/MediaPlayer: Error (1,-2147479543) D/VideoView: Error: 1,-2147479543 E/MediaPlayer: Error (1,-38) D/VideoView: Error: 1,-38 E/MediaPlayer: Error (1,-38) D/VideoView: Error: 1,-38 E/MediaPlayer: Error (1,-2147479551) D/VideoView: Error: 1,-2147479551 E/MediaPlayer: Error (1,-38) 

He explorado diferentes combinaciones y esas son mis pistas:

  • Probado varios dispositivos (Galaxy 1, HTC One M7, Moto G2, Nexus 9, Nexus 6). Sólo aparece en el Nexus 6.
  • Sucede con cualquier video en formato webm. Convertir el video para solucionar el problema mp4
  • Probado con diferentes videos en formato webm también (el problema sigue allí)
  • Sé que puedo agregar un oyente del error al VideoView para quitar el diálogo con el error pero el bloque de UI es crítico para mí también.
  • El error nunca aparece en la primera página, pero luego parece aleatorio.

Alguien sabe lo que está pasando aquí y ¿cómo puedo solucionarlo?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.