Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo limpiar el soporte de superficie cuando el reproductor de medios está terminado?

Hice un reproductor de video con superficie y mediaplayer. Tengo 10 videos y 10 botones. Si hace clic en cada uno de los botones, cada uno de ellos se reproduce.

Aquí está mi código

  • Android Switch widget textOn y textOff no funcionan en Lollipop
  • Simple gesto de desplazamiento a la actividad tutorial?
  • La mejor manera de implementar View.OnClickListener en android
  • OnCreate () y onCreateView () invoca mucho más de lo requerido (Fragmentos)
  • Gradle - Android Studio crea aplicaciones multidex demasiado lentas
  • AlarmManager no funciona en varios dispositivos
  • //onCreate holder = surfaceview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //Button1 if(mp == null)mp = new MediaPlayer(); mp.setDataSource(mediaplay_path); mp.setDisplay(holder); mp.setScreenOnWhilePlaying(true); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepare(); mp.start(); //Button2 if(mp != null){ mp.stop(); mp.reset(); } mp.setDataSource(mediaplay_path2); mp.setDisplay(holder); mp.setScreenOnWhilePlaying(true); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepare(); mp.start(); //Button3~Button10 is same as Button2.. 

    todo esta bien. Mi vídeo personalizado está funcionando bien. Pero cuando el video pasa a la siguiente, la última escena del video anterior permanece durante un tiempo y pasa a la siguiente escena de video.

    Creo que es porque la vista previa de la superficie debe estar clara antes de que el siguiente video esté en reproducción. Pero no tengo ni idea de cómo despejar la superficie o soporte de superficie.

    He buscado esto, pero sólo podría encontrar cómo reproducir el vídeo, no cómo borrar la vista de superficie que se establece el disaply de mediaplayer.

    Por favor, ayúdame ~~!

  • Alternar dispositivo A2DP (Android)
  • ¿Cómo puedo obtener la última versión de ConstraintLayout para Android?
  • Google map v2 Infowindow personalizado con dos botones o ImageView
  • Google Play: hemos encontrado SDK de anuncios en tu aplicación
  • Programar el atributo AlignParentRight al botón en RelativeLayout no funciona?
  • ¿Cómo afectar a la generación de código Delphi XEx para objetivos Android / ARM?
  • 5 Solutions collect form web for “Cómo limpiar el soporte de superficie cuando el reproductor de medios está terminado?”

    SurfaceHolder tiene métodos lockCanvas que le permitirán dibujar directamente a la Surface . Utilice el método drawColor del Canvas para llenarlo con negro.

    Dicho esto, puede ser preferible quitar el SurfaceView (como lo sugirió smile2you), porque eso debería destruir la Surface completamente y liberar los recursos no utilizados. Y definitivamente asegúrese de que está llamando a la release en el MediaPlayer s después de que hayan terminado con la reproducción. Si te quedas con demasiados recursos de video, se detendrá tu aplicación.

    Me tomó dos semanas entender esto. Al configurar el soporte de superficie en TRANSPARENT, Android destruirá la superficie. A continuación, volver a configurar OPAQUE crea una nueva superficie que "limpia" la superficie. Tenga en cuenta que los eventos de surfacecreate y surfacedestroy se dispararán, por lo que si tiene código allí, tenga cuidado. Puse una visión de la imagen fijada al negro para darle un fondo negro. Hay quizá mejores maneras para eso.

     private void playVideoA() { imageViewBlack.bringToFront(); surfaceHolder.setFormat(PixelFormat.TRANSPARENT); surfaceHolder.setFormat(PixelFormat.OPAQUE); surfaceView.bringToFront(); mediaPlayerA.setDisplay(surfaceHolder); //surfaceView.setAlpha((float) 0.01); mediaPlayerA.start(); }; private void prepareVideoA(String url) { try { mediaPlayerA = new MediaPlayer(); mediaPlayerA.setDataSource(url); mediaPlayerA.prepareAsync(); mediaPlayerA.setOnPreparedListener(this); mediaPlayerA.setOnCompletionListener(this); mediaPlayerA.setOnBufferingUpdateListener(this); mediaPlayerA.setOnInfoListener(this); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; @Override public void onPrepared(MediaPlayer mp) { playVideoA() } 

    Puede ser que usted puede utilizar removeView para quitar el viejo videovision del custome, después agrega la nueva visión

     video.getHolder().setFormat(PixelFormat.TRANSPARENT); video.getHolder().setFormat(PixelFormat.OPAQUE); video.setVideoURI(Uri.parse(temp)); video.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); 

    Funciona para mi

    Surfaceview.setVisibility (View.GONE);

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