por pantalla negra k10 golpe con como celular arreglar android flicker android-videoview

k10 - Pantalla negra Android VideoView



pantalla negra youtube celular (21)

Al extender un TextureView, no obtengo ninguna pantalla negra al principio o al final. Esto es si desea evitar el uso de ZOrderOnTop(true) .

public class MyVideoView extends TextureView implements TextureView.SurfaceTextureListener { private MediaPlayer mMediaPlayer; private Uri mSource; private MediaPlayer.OnCompletionListener mCompletionListener; private boolean isLooping = false; public MyVideoView(Context context) { this(context, null, 0); } public MyVideoView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyVideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setSurfaceTextureListener(this); } public void setSource(Uri source) { mSource = source; } public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) { mCompletionListener = listener; } public void setLooping(boolean looping) { isLooping = looping; } @Override protected void onDetachedFromWindow() { // release resources on detach if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } super.onDetachedFromWindow(); } /* * TextureView.SurfaceTextureListener */ @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { Surface surface = new Surface(surfaceTexture); try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setLooping(isLooping); mMediaPlayer.setDataSource(getContext(), mSource); mMediaPlayer.setSurface(surface); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); mMediaPlayer.reset(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { surface.release(); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) {} }

He estado buscando una manera de deshacerme de la desagradable pantalla inicial negra en una VideoView antes de que se ejecute el método start ().

Lo he intentado con la imagen de fondo en el widget, pero no funciona como esperaba. También he intentado poner una imagen del primer fotograma en el video en la parte superior de VideoView y ocultarlo después del método stars (). Agregar un oyente Preparado para iniciar el video y luego ocultar la imagen. Esto funciona, pero hay un parpadeo horrible en la transición y no sé cómo deshacerme de él.

Gracias por su respuesta. Agregar el MediaController no tuvo ningún efecto. El problema persiste (todavía veo el parpadeo negro) y no quiero que los controles de video estén visibles. Mi código se ve así:

VideoView vSurface= (VideoView) findViewById(R.id.surfaceView1); vSurface.setVideoURI(Uri.parse("android.resource://com.mypackage/" + R.raw.video1)); vSurface.setVisibility(View.VISIBLE); vSurface.setOnPreparedListener(this); vSurface.setDrawingCacheEnabled(true); vSurface.setOnErrorListener(this);


Es un poco tarde para esta respuesta, pero tal vez otros usuarios tengan el mismo problema y encuentren esta pregunta.

Ya lo he solucionado, estableciendo un BackgroundResource inicialmente y luego, al iniciar el video, configuré el fondo en un color invisible.

VideoView myView = findViewById(R.id.my_view); myView.setBackgroundResource(R.drawable.some_resource); // some stuff // this is when starting the video myView.setVideoUri(someUri); // also set MediaController somewhere... //... // now set the backgroundcolor to be not visible (first val of Color.argb(..) is the alpha) myView.setBackGroundColor(Color.argb(0, 0, 0, 0)); //... myView.start();


Esta funciona para mí :

En XML: VideoView se esconde detrás de un diseño relativo con fondo blanco

<VideoView android:id="@+id/myVideo" android:layout_below="@+id/logo_top" android:layout_width="200dp" android:layout_height="200dp" android:layout_centerHorizontal="true" /> <RelativeLayout android:id="@+id/mask" android:background="#FFFFFF" android:layout_below="@+id/logo_top" android:layout_centerHorizontal="true" android:layout_width="200dp" android:layout_height="200dp" > </RelativeLayout>

y en la actividad: onCreate

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acceuil); myVideo = (VideoView) findViewById(R.id.myVideo); mask = (RelativeLayout) findViewById(R.id.mask); String path = "android.resource://" + getPackageName() + "/" + R.raw.anim_normal; myVideo.setVideoURI(Uri.parse(path)); myVideo.start(); }

onStart:

public void onStart() { final long time = System.currentTimeMillis(); super.onStart(); new CountDownTimer(5000, 100) { @Override public void onTick(long l) { long time2 = System.currentTimeMillis(); if((time2 - time) > 500) { mask.setVisibility(View.GONE); } } }.start();

Espero que esto ayude.


Esto definitivamente es raro, pero mejor que superponer una imagen (IMO).

boolean mRestored = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRestored = savedInstanceState != null; } @Override public void onPrepared(MediaPlayer mp) { if (!mRestored) vSurface.seekTo(1); }

Suponiendo que está colocando cosas en savedInstanceState en onSaveInstanceState .


Esto funcionó para mí:

videoView.setBackgroundColor(Color.WHITE); // Your color. videoView.start(); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { videoView.setBackgroundColor(Color.TRANSPARENT); } });

Al menos dos años después, pero espero que haya sido útil.


Funciona para mí tanto en Actividad como en Fragmento.

VideoView mVideo = (VideoView) findViewById(R.id.yourViewViewId); mVideo.setVideoURI(mUri); mVideo.setZOrderOnTop(false); SurfaceHolder surfaceholder = mVideo.getHolder(); surfaceholder.setFormat(PixelFormat.TRANSPARENT);


Me encuentro con el mismo problema y lo resuelvo con la solución aceptada anterior más esto:

@Override public void onPrepared(MediaPlayer mp) { mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { Log.d(TAG, "onInfo, what = " + what); if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) { // video started; hide the placeholder. placeholder.setVisibility(View.GONE); return true; } return false; } });

Creo que "Preparado" solo significa que el video está listo para jugar, pero no significa que el video comenzó a reproducirse. Si oculta el marcador de posición en onPrepared, la pantalla seguirá mostrando una pantalla negra.

En mi Note3 y Nexus, esta solución funciona bien.


Ninguno de los anteriores funcionó para mí. En mi caso, se llama a onPrepared ANTES de que el marco negro desaparezca, por lo que aún vería el marco negro.

Necesitaba una solución donde el video apareció poco después del primer fotograma.

Entonces, lo que hice fue configurar el VideoView alpha en 0 en xml:

android:alpha="0"

y luego, antes de comenzar el video, vuelvo a animar el alfa a 1:

videoView.animate().alpha(1); videoView.seekTo(0); videoView.start();

como alternativa, puede publicar un Runnable retrasado para establecer el alfa en 1, en lugar de animarlo.


Para evitar molestos parpadeos y problemas con la pantalla negra, escribí FrameVideoView .

Aprovecha los beneficios de la ''solución de marcador de posición'' y (si su dispositivo ejecuta API nivel 14 o superior) de TextureView , que es mucho más eficiente que VideoView .

Escribí un article en nuestro blog para cubrir lo que realmente hace.

Es simple de usar:

Agregar FrameVideoView al diseño:

<mateuszklimek.framevideoview.FrameVideoView android:id="@+id/frame_video_view" android:layout_width="@dimen/video_width" android:layout_height="@dimen/video_height" />

encuentra su instancia en Activity y llama a los métodos correspondientes en onResume y onPause :

public class SampleActivity extends Activity { private FrameVideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple); String uriString = "android.resource://" + getPackageName() + "/" + R.raw.movie; videoView = (FrameVideoView) findViewById(R.id.frame_video_view); videoView.setup(Uri.parse(uriString), Color.GREEN); } @Override protected void onResume() { super.onResume(); videoView.onResume(); } @Override protected void onPause() { videoView.onPause(); super.onPause(); } }


Para las personas que todavía están buscando una respuesta para esto, me llamó la VideoView.start() llamar a VideoView.start() y VideoView.pause() en sucesión dentro de onPrepared . Sé que esta puede no ser la forma ideal de lograr esto, pero podría ser la que requiera una solución mínima en el código. Espero que esto funcione para usted también.

@Override public void onPrepared(MediaPlayer mp) { mVideoView.start(); mVideoView.pause(); }


Preferiría esta solución: https://.com/a/11016465/2267723

está sobre la superficie así que crea un diseño ficticio @ fragmento y no verás este flash negro otra vez ...


Solo muestra un cuadro del video como vista previa.

vSurface.SeekTo(100);


Solo uso VideoView # setBackgroundDrawable (), creo.

  1. ajustes iniciales.

    VideoView.setBackgroundDrawable(yourdrawableid);

  2. iniciar video

    VideoView.start(); VideoView.setBackgroundDrawable(0);


Tengo el mismo problema y encontré una solución. Es un poco hacky pero funciona. Entonces, básicamente, necesitas poner tu VideoView en FrameLayout. En la vista de video necesita agregar otro FrameLayout con el fondo de su video y cuando su video esté cargado y listo para jugar, ocultará el marcador de posición.

<FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:layout_marginTop="50dip" > <VideoView android:id="@+id/geoloc_anim" android:layout_width="fill_parent" android:layout_height="172dip" android:layout_gravity="top|center" android:visibility="visible"/> <FrameLayout android:id="@+id/placeholder" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/fondvert_anim"> </FrameLayout>

En su actividad, necesita implementar OnPreparedListener y agregar esto

//Called when the video is ready to play public void onPrepared(MediaPlayer mp) { View placeholder = (View) findViewById(R.id.placeholder); placeholder.setVisibility(View.GONE); }

Entonces, cuando el video esté listo, ocultamos nuestro marcador de posición y ese truco evita la pantalla de parpadeo negro.

Espero que esto ayude a alguien.


Tengo el mismo problema. Acabo de usar videov.setBackgroundColor (Color.WHITE) y luego preparé el color. TRANSPARENT. Blanco es mejor que negro para mí.


Tuve el mismo problema en Galaxy Tab 2, Android 4.1.1.

Hacer videoView.setZOrderOnTop(true); y el siguiente videoView.start()

Funciona bien para mí.


Tuve el mismo problema y esto funcionó para mí ...

Cuando desee mostrar video, haga videoView.setZOrderOnTop (false); y cuando quiera ocultar el video, solo haga videoView.setZOrderOnTop (verdadero);


Tuve el mismo problema. Descubrí que la razón principal de esto era el uso de FrameLayout como diseño principal. Use RelativeLayout como el diseño principal de VideoView


Use svVideoView.seekTo (posición) .

Dar posición dentro de 5 (ms).

onPause(): position=svVideoView.getCurrentPosition() onResume(): svVideoView.seekTo(position);


mira esto

VideoView videoView = (VideoView) findViewById(R.id.VideoView); MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); Uri video = Uri.parse("android.resource://your_package_name/"+R.raw.monkeysonthebed_video); videoView.setMediaController(mediaController); videoView.setVideoURI(video); videoView.start();


Esta es una buena solución:

package com.example.videoviewpractice; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.MediaController; import android.widget.VideoView; public class MainActivity extends Activity { VideoView myVideoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initVideo(); } private void initVideo() { myVideoView = (VideoView) findViewById(R.id.videoView1); String url = "http://mtc.cdn.vine.co/r/videos/3DF00EB7001110633055418310656_1e50d6d9a65.3.2.mp4?" + "versionId=KVMUFFGqe6rYRrGKgl8hxL6eakVAErPy"; myVideoView.setVideoURI(Uri.parse(url)); myVideoView.setMediaController(new MediaController(this)); myVideoView.requestFocus(); } public void gone(View v){ myVideoView.setZOrderOnTop(true); View placeholder = (View) findViewById(R.id.placeholder); placeholder.setVisibility(View.GONE); myVideoView.start(); } }

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:layout_marginTop="50dip" > <VideoView android:id="@+id/videoView1" android:layout_width="300dp" android:layout_height="300dp" android:layout_gravity="top|center" android:visibility="visible" /> <FrameLayout android:id="@+id/placeholder" android:layout_width="300dp" android:layout_height="300dp" android:layout_gravity="top|center" android:background="@drawable/ic_launcher" android:onClick="gone" > </FrameLayout> </FrameLayout> </LinearLayout>