videos verde solo samsung reproducir reproduce puedo puede porque pantalla negra error celular android video screen media-player playback

verde - youtube no reproduce videos android



Pantalla negra al volver a la actividad de reproducción de video en Android (7)

Actualmente estoy desarrollando la aplicación para Android ServeStream y me he encontrado con un problema que no puedo solucionar. Mi aplicación transmitirá música y videos usando la clase android MediaPlayer. He modelado mi clase después del ejemplo encontrado en:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html

La diferencia entre este ejemplo y mi propio código es que mi MediaPlayer se ejecuta en un servicio que le permite continuar la reproducción en segundo plano. El problema con el ejemplo de código de Android es si estoy viendo un video y dejo la ventana / actividad actual (es decir, presiono el botón de menú, etc.) y regreso a la actividad de reproducción obtengo una pantalla negra pero todavía recibo el audio del video eso es jugar

Cuando mi actividad de reproducción se crea inicialmente, se ejecuta el código que se muestra a continuación. Este código crea esencialmente la vista utilizada para la reproducción y luego la vincula al reproductor multimedia:

setContentView(R.layout.mediaplayer_2); mPreview = (SurfaceView) findViewById(R.id.surface); holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ... mMediaPlayer.setDisplay(holder);

La línea importante es mMediaPlayer.setDisplay (holder) porque vincula la vista / visualización actual al reproductor multimedia. La vista (el "titular") se destruye cuando abandonas la actividad. Después de regresar a la actividad y volver a crear la vista, la ejecución de mMediaPlayer.setDisplay (holder) de nuevo no parece volver a adjuntar la vista recién creada. Se muestra una pantalla negra en lugar del video.

¿Alguien tiene una solución o solución para este problema? Agradecería cualquier ayuda o consejo.


Puedes hacer: mMediaPlayer.setDisplay(null) cuando se surfaceDestroy y cuando ingresas de nuevo video setDisplay para mediaPlayer con un nuevo surfaceHolder .
Recuerde, siempre coloque este código debajo dentro de onStart , ya que cuando presiona home o lockscreen, forzará que ''sufaceCreate'' se dispare con el nuevo soporte. La vista se volverá a crear, el video mostrará la pantalla en negro

holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

¡¡Espero que esto ayude!!


Creo que sé la causa del problema. Parece que el reproductor de medios inicializa su superficie ÚNICAMENTE cuando llama a prepare / Async (). Si cambias la superficie después de eso, obtendrás lo que tienes. Entonces la solución sería desactivar el ciclo de vida estándar de la actividad a través de android: configChanges = "orientation | keyboardHidden". Esto evitará que tu actividad se vuelva a recrear. De lo contrario, debe llamar para prepararse cada vez que vuelva a crear el titular.


¡Tengo el mismo problema!

Mientras se reproduce el video, presiono el botón INICIO y luego regreso a la Aplicación. Entro:

public void surfaceCreated(SurfaceHolder holder) { player.setDisplay(holder); playVideo(); }

En el playVideo() tengo:

private void playVideo() { if (extras.getString("video_path").equals("VIDEO_URI")) { showToast("Please, set the video URI in HelloAndroidActivity.java in onClick(View v) method"); } else { try { if (flag == 0) { player.setDataSource(extras.getString("video_path")); player.prepareAsync(); flag = 1; } else { player.start(); } } catch (IllegalArgumentException e) { showToast("Error while playing video"); Log.i(TAG, "========== IllegalArgumentException ==========="); e.printStackTrace(); } catch (IllegalStateException e) { showToast("Error while playing video"); Log.i(TAG, "========== IllegalStateException ==========="); e.printStackTrace(); } catch (IOException e) { showToast("Error while playing video. Please, check your network connection."); Log.i(TAG, "========== IOException ==========="); e.printStackTrace(); } } }

Y tengo un fondo negro en blanco y escucho audiostream.

Me di cuenta de que si en el primer momento de lanzar esta actividad no hago player.setDisplay(holder); Tendré el mismo comportamiento .

Pasé dos días tratando de resolver este problema ...


EDITAR: Tenga en cuenta que esta solución no funciona en dispositivos 4.x - el video simplemente nunca aparece, solo la pantalla en blanco y no pude hacer que funcione allí.

Aquí hay una máquina de estado que hace lo siguiente:
1. reproduce un par de segundos de video /res/raw/anim_mp4.mp4 (procedimiento iniciado en el método onCreate ())
2. Si el usuario presiona el botón de inicio y luego regresa a la aplicación, buscará el video para iniciar la posición y pausará de inmediato (procedimiento iniciado en el método onResume ())

package com.test.video; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.WindowManager; public class MediaPlayerActivity extends Activity implements OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnSeekCompleteListener, SurfaceHolder.Callback { private final int STATE_NOT_INITIALIZED = 0; private final int STATE_INITIALIZING = 1; private final int STATE_INITIALIZED = 2; private final int STATE_SEEKING = 3; private final int STATE_DELAYING = 4; private final int STATE_PLAYING = 5; private final int STATE_FINISHED = 6; private final int STATE_RESUMED = 7; private final int STATE_RESUMED_PREPARING = 8; private final int STATE_RESUMED_PREPARED = 9; private final int STATE_RESUMED_SEEKING = 10; private int state = STATE_NOT_INITIALIZED; private SurfaceView surface; private MediaPlayer player; private SurfaceHolder holder; @Override protected void onCreate(Bundle savedInstanceState) { Log.d(Constants.TAG, "onCreate()"); super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.mediaplayer); surface = (SurfaceView) findViewById(R.id.idSurface); holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override protected void onStart() { Log.d(Constants.TAG, "onStart()"); super.onStart(); state(); } @Override protected void onResume() { Log.d(Constants.TAG, "onResume()"); super.onResume(); if (STATE_FINISHED == state) { state = STATE_RESUMED; state(); } } @Override protected void onDestroy() { Log.d(Constants.TAG, "onDestroy()"); super.onDestroy(); if (player != null) { player.release(); player = null; } } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { Log.d(Constants.TAG, "surfaceChanged()"); } @Override public void surfaceCreated(SurfaceHolder arg0) { Log.d(Constants.TAG, "surfaceCreated()"); } @Override public void surfaceDestroyed(SurfaceHolder arg0) { Log.d(Constants.TAG, "surfaceDestroyed()"); } @Override public void onPrepared(MediaPlayer mp) { Log.d(Constants.TAG, "onPrepared()"); state(); } @Override public void onCompletion(MediaPlayer mp) { Log.d(Constants.TAG, "onCompletion()"); state(); } @Override public void onSeekComplete(MediaPlayer mediaplayer) { Log.d(Constants.TAG, "onSeekComplete()"); state(); } private class ResumeDelayed extends PlayDelayed { protected void onPostExecute(Void result) { Log.d(Constants.TAG, "ResumeDelayed.onPostExecute()"); state(); }; } private void initPlayer() { Log.d(Constants.TAG, "initPlayer()"); try { if (player == null) { player = new MediaPlayer(); player.setScreenOnWhilePlaying(true); } else { player.stop(); player.reset(); } String uri = "android.resource://" + getPackageName() + "/" + R.raw.anim_mp4; player.setDataSource(this, Uri.parse(uri)); player.setDisplay(holder); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setOnPreparedListener(this); player.prepareAsync(); player.setOnCompletionListener(this); player.setOnSeekCompleteListener(this); } catch (Throwable t) { Log.e(Constants.TAG, "Exception in media prep", t); } } private class PlayDelayed extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... arg0) { try { Thread.sleep(1000); } catch (InterruptedException e) { Log.e(Constants.TAG, "Can''t sleep", e); } return null; } protected void onPostExecute(Void result) { Log.d(Constants.TAG, "PlayDelayed.onPostExecute()"); initPlayer(); }; } private void state() { switch (state) { case STATE_NOT_INITIALIZED: state = STATE_INITIALIZING; initPlayer(); break; case STATE_INITIALIZING: state = STATE_INITIALIZED; new PlayDelayed().execute(); break; case STATE_INITIALIZED: state = STATE_SEEKING; player.start(); player.seekTo(0); break; case STATE_SEEKING: state = STATE_DELAYING; player.pause(); new ResumeDelayed().execute(); break; case STATE_DELAYING: state = STATE_PLAYING; player.start(); break; case STATE_PLAYING: state = STATE_FINISHED; break; case STATE_RESUMED: state = STATE_RESUMED_PREPARING; initPlayer(); break; case STATE_RESUMED_PREPARING: state = STATE_RESUMED_PREPARED; new PlayDelayed().execute(); break; case STATE_RESUMED_PREPARED: state = STATE_RESUMED_SEEKING; player.start(); player.seekTo(0); break; case STATE_RESUMED_SEEKING: state = STATE_FINISHED; player.pause(); break; default: break; } }

Diseño de mediaplayer.xml:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/black" > <SurfaceView android:id="@+id/idSurface" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" />

AndroidManifest.xml se ve así:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.video" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:theme="@android:style/Theme.Black.NoTitleBar" > <activity android:name=".MediaPlayerActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@android:style/Theme.Black.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>


Vi el mismo problema simplemente reproduciendo video en mi Galaxy S3 y en una tableta Xoom. Desactivé la aceleración de hardware (HW) en la configuración del reproductor y resolvió el problema. No desarrollo para Android, pero espero que esto te lleve a una solución. Tal vez puede alternar esta configuración para una solución alternativa. El dispositivo que estoy usando podría no tener aceleración HW.


Después de mucho buscar en Google y arañar la cabeza sobre el diagrama de estado de MediaPlayer , finalmente logré evitar esta llamada pantalla negra. Ya publiqué en la sección de comentarios de la OP que este problema parece haberse resuelto con las últimas versiones de Android (superiores a 4.x), por lo que opté por tener un comportamiento similar también en los dispositivos de Gingerbread.

Huelga decir que los métodos de devolución de llamada de SurfaceHolder juegan un papel muy importante en el ciclo de vida de una implementación limitada de MediaPlayer - SurfaceView . Y esos mismos métodos de devolución de llamada me fueron útiles para salir de esta situación.

Primero:

inside onCreate (): - Cosas básicas de inicialización ...

mVideoSurface = (SurfaceView) findViewById(R.id.videoSurface); videoHolder = mVideoSurface.getHolder(); videoHolder.addCallback(this); // For Android 2.2 videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // Media Player and Controller player = new MediaPlayer(); controller = new VideoControllerView(this);

Luego, devoluciones de llamada de SurfaceView:

no se olvide de configurar la Display en su MediaPlayer y en mi humilde opinión, surfaceCreated() es el mejor lugar para hacerlo.

@Override public void surfaceCreated(SurfaceHolder holder) { player.setDisplay(holder); try { player.prepareAsync(); } catch (IllegalStateException e) { e.printStackTrace(); } }

Y aquí está lo más importante. Cuando el usuario abandona la actividad actual presionando el botón Inicio o abriendo una actividad diferente esperando algún resultado, nuestro SurfaceView será destruido. Lo que quería lograr era reanudar la reproducción del video continuo desde la posición en la que se estaba reproduciendo cuando se cambió el contexto. Entonces, para hacer eso,

Guarde la posición de reproducción actual en una variable para que podamos usarla más adelante para buscar nuestra reproducción en esa posición particular. Y uno más. Libera la maldita instancia de MediaPlayer . Intenté evitar la publicación de la instancia de MediaPlayer y su recreación, pero sigo fallando una y otra vez. Entonces ... punto hecho.

@Override public void surfaceDestroyed(SurfaceHolder holder) { if (player != null) { mCurrentVideoPosition = player.getCurrentPosition(); player.release(); player = null; } }

Ahora, onPrepared () Inicializa cualquier MediaController aquí si estás interesado. Verifique si el video ya se estaba reproduciendo y busque el video en esa posición.

@Override public void onPrepared(MediaPlayer mp) { controller.setMediaPlayer(this); controller.setAnchorView((FrameLayout) findViewById(R.id.videoSurfaceContainer)); player.start(); if (mCurrentVideoPosition != 0) { player.seekTo(mCurrentVideoPosition); player.start(); } }

Finalmente, para reproducir el video:

void playVideo(){ try { if (player == null) player = new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDataSource("SOME_VIDEO_FILE.3gp"); player.setOnPreparedListener(this); player.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { mp.reset(); return false; } }); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

Y eso es todo. Sé que el problema no está allí con las versiones más nuevas y todo genial, pero ... muchos GB todavía están por ahí.


¿Desea que la actividad no se muestre cuando regrese? Si es así, simplemente puede usar la bandera

i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Si quieres que tus medios se reproduzcan en segundo plano, te sugiero que uses la superficie de video, ya que me ha irritado jugar en segundo plano, aunque no quiero. Hay formas pero espero que esta sea fructífera para usted http://www.brightec.co.uk/blog/custom-android-media-controller

este enlace en realidad es para personalizar los controladores de medios como lo desee, pero como creé el mío con él, me molestó el hecho de presionar la tecla de inicio, el video se reproducirá en segundo plano.