Surafce ha sido liberado error
Estoy creando un reproductor multimedia para videos en línea, pero cuando estoy tratando de ejecutarlo está mostrando un error que la superficie ha lanzado. Aquí está mi codificación:
public class VideoSample1 extends Activity implements Callback, OnPreparedListener, OnCompletionListener, OnClickListener, OnSeekCompleteListener, android.view.SurfaceHolder.Callback { public String video_path = "My video URL"; private SurfaceView surfaceViewFrame; private MediaPlayer player; private SurfaceHolder holder; private Bundle extras; private static final String TAG = "log_tag"; private boolean b =false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.customvideoview); extras = getIntent().getExtras(); surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame); surfaceViewFrame.setOnClickListener(this); surfaceViewFrame.setClickable(false); holder = surfaceViewFrame.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); player = new MediaPlayer(); player.setOnPreparedListener(this); player.setOnCompletionListener(this); player.setOnSeekCompleteListener(this); player.setScreenOnWhilePlaying(true); player.setDisplay(holder); } @Override protected void onDestroy() { super.onDestroy(); player.stop(); player.release(); player = null; Toast.makeText(VideoSample1.this, "back",Toast.LENGTH_SHORT).show(); finish(); } private void playVideo() { new Thread(new Runnable() { public void run() { try { player.setDataSource(VideoSample1.this, Uri.parse(extras.getString("Video URL"))); player.prepareAsync(); } catch (IllegalArgumentException e) { Log.d("admin","Error while playing video"); e.printStackTrace(); Log.i(TAG,"tag"+ e.getMessage()); } catch (IllegalStateException e) { Log.d("admin","Error1 while playing video"); e.printStackTrace(); Log.i(TAG, "tag"+e.getMessage()); } catch (IOException e) { e.printStackTrace(); Log.d("admin","Error while playing video.Please, check your network connection"); Log.i(TAG, "tag"+e.getLocalizedMessage()); } } }).start(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder holder) { playVideo(); } public void surfaceDestroyed(SurfaceHolder holder) { } public void onPrepared(MediaPlayer mp) { if (!player.isPlaying()) { b = true; player.start(); } } public void onCompletion(MediaPlayer mp) { mp.stop(); finish(); } public void onSeekComplete(MediaPlayer mp) { } @Override public void invalidateDrawable(Drawable who) { } @Override public void scheduleDrawable(Drawable who, Runnable what, long when) { // TODO Auto-generated method stub } @Override public void unscheduleDrawable(Drawable who, Runnable what) { // TODO Auto-generated method stub } @Override public void onClick(View v) { // TODO Auto-generated method stub } }
Me referí a esto , y otros sitios de desbordamiento de pila, pero nada funcionó conmigo 🙁 El error está cerca de setdisplay (titular) Y aquí están mis mensajes de Logcat:
- Detener y iniciar música en las llamadas entrantes
- ¿Cómo hacer que WakefulService (IntentService) espere hasta que MediaPlayer termine?
- En android, ¿cómo puedo guardar un flujo RTSP en un archivo mientras lo reproduzco?
- Android Detener música de fondo cuando la tecla Inicio presionada
- Grabar audio con MediaRecorder y reproducir simultaniosamente con MediaPlayer
08-31 10:18:01.512: E/AndroidRuntime(1162): FATAL EXCEPTION: main 08-31 10:18:01.512: E/AndroidRuntime(1162): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.msense.msenseplayer/com.msense.msenseplayer.VideoSample1}: java.lang.IllegalArgumentException: The surface has been released 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.ActivityThread.access$600(ActivityThread.java:123) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.os.Handler.dispatchMessage(Handler.java:99) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.os.Looper.loop(Looper.java:137) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.ActivityThread.main(ActivityThread.java:4429) 08-31 10:18:01.512: E/AndroidRuntime(1162): at java.lang.reflect.Method.invokeNative(Native Method) 08-31 10:18:01.512: E/AndroidRuntime(1162): at java.lang.reflect.Method.invoke(Method.java:511) 08-31 10:18:01.512: E/AndroidRuntime(1162): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 08-31 10:18:01.512: E/AndroidRuntime(1162): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 08-31 10:18:01.512: E/AndroidRuntime(1162): at dalvik.system.NativeStart.main(Native Method) 08-31 10:18:01.512: E/AndroidRuntime(1162): Caused by: java.lang.IllegalArgumentException: The surface has been released 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.media.MediaPlayer._setVideoSurface(Native Method) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.media.MediaPlayer.setDisplay(MediaPlayer.java:641) 08-31 10:18:01.512: E/AndroidRuntime(1162): at com.msense.msenseplayer.VideoSample1.onCreate(VideoSample1.java:53) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.Activity.performCreate(Activity.java:4578) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 08-31 10:18:01.512: E/AndroidRuntime(1162): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 08-31 10:18:01.512: E/AndroidRuntime(1162): ... 11 more
- Establecer sonido de notificación en la carpeta Activos
- Forzar el vídeo para que se reproduzca en Orientación vertical sólo con MediaPlayer y VideoView
- Vitamio Media Player Licencias
- Transmisión de video en vivo entre dos teléfonos Android
- Transmisión al MediaPlayer de Android
- Android ExoPlayer: ¿Resuelve el problema de reproducción sin interrupciones / sin fisuras que está roto para el reproductor de medios Android
- MediaPlayer.setDataSource () y prepare () no funciona - android
- ¿Cómo actualizar SeekBar de MediaPlayer en funcionamiento?
Hola, por fin he resuelto mi error. Su simple que he añadido player.setdisplay bajo método surfacecreated como
public void surfaceCreated(SurfaceHolder holder) { playVideo(); player.setDisplay(holder); }
Y esto resolvió mi problema.
El problema es que está configurando SurfaceHolder a MediaPlayer antes de la creación de SurfaceView. O bien esperar hasta que se crea la vista de superficie o llamar al método setDisplay dentro del método surfaceCreated.
- Los puntos de interrupción no funcionan al depurar la biblioteca nativa de Android en Visual Studio 2015
- Cómo implementar el menú contextual en la pulsación de teclas en lugar de hacer clic largo / toque