mój plik xml:powierzchnia została wydana przy próbie setDisplay do MediaPlayer
<SurfaceView
android:id="@+id/surfaceView"
android:layout_marginTop="50dp"
android:layout_width="fill_parent"
android:layout_height="300dp" />
moją funkcję setDisplay:
public void playVideo() {
MediaPlayer mp = new MediaPlayer();
SurfaceView sv = (SurfaceView) this.findViewById(R.id.surfaceView);
try {
mp.setDataSource("sdcard/test/a.3gp");
SurfaceHolder sh = sv.getHolder();
mp.setDisplay(sh);***----the exception occured here***
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
dziennik jak poniżej:
04-24 22:19:33.645: W/System.err(16106): java.lang.IllegalArgumentException: The surface has been released
04-24 22:19:33.645: W/System.err(16106): at android.media.MediaPlayer._setVideoSurface(Native Method)
04-24 22:19:33.645: W/System.err(16106): at android.media.MediaPlayer.setDisplay(MediaPlayer.java:698)
Znalazłem kilka podobnych pytań tutaj, ale wszystkie te nie są dla mnie odpowiednie. Czekam na twoje odpowiedzi. Dziękuję bardzo.
Próbowałem tego, co mówisz, ale to nie działa, a ekran wstrzymania staje się czarny. Oczekiwanie na więcej informacji. Bardzo dziękuję za odpowiedź. – Cooosuper
Właśnie zauważyłem, że w SurfaceDestroyed umieszczam zsynchronizowane w synchronizowanym bloku tego samego obiektu. Usuń drugi. Wygląda na to, że utknąłeś w oczekiwaniu. Sugeruję, że jeśli to nie zadziała, dołączasz debugger i wstrzymujesz wszystkie wątki, które widzisz, aby znaleźć wątek, który czeka() – EyalBellisha
Próbowałem innego sposobu, aby to naprawić. Przenoszę 'setDisplay' do Callback, gdy powierzchnia została utworzona ("surfaceCreated"). Bardzo dziękuję za odpowiedź! – Cooosuper