La surface a été libérée lorsque j'essaie de définir Display to MediaPlayer
Mon fichier xml:
<SurfaceView
android:id="@+id/surfaceView"
android:layout_marginTop="50dp"
android:layout_width="fill_parent"
android:layout_height="300dp" />
Ma fonction à 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();
}
}
le journal en tant que ci-dessous:
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)
J'ai trouvé des questions similaires ici, mais tous ceux-là ne sont pas adaptés pour moi. En attente de vos réponses. Merci beaucoup.
source d'informationauteur Cooosuper
Vous devez vous connecter pour publier un commentaire.
La Surface peut être détruit. C'est pourquoi vous devez ajouter à la une
public void surfaceDestroyed(SurfaceHolder holder)
à votre SurfaceView de mise en œuvre comme ceci:Vous devez également ajouter une fonction qui gère la création de surfaces:
Et modifier votre propre fonction de cette manière:
Vous avez une autre option qui est la façon dont Google vous suggère d'utiliser SurfaceView: dans un thread séparé.
C'est quelque chose lié à la séquence de l'exécution, la surface doit être créée avant le réglage de l'affichage pour la
MediaPlayer
de sorte que vous devez surcharger la méthode de rappelsurfaceCreated
à la suivante:et maintenant il n'y a pas besoin de setDisplay à l'intérieur de votre méthode de lecture:
Faire usage de SurfaceHolder.Rappel ci-dessous
La façon la plus simple est juste de l'appeler
setDisplay
danssurfaceCreated
:et n'oubliez pas de supprimer la liaison de surface:
Note: media player doit être initialisé quelque part avant, par exemple dans
onCreate
.Pour ceux qui ont encore des problèmes, essayez de la mise en œuvre de SurfaceHolder.Rappel dans votre activité/fragment/etc et à la onCreate/onCreateView méthode, appelez le addCallback(SurfaceHolder.Rappel callback) méthode, à l'aide de votre activité/fragment/etc en tant que paramètre de rappel.
Nous pouvons regarder VideoView code source:
Afin que nous puissions apprendre que nous devrions utiliser
mediaplayer.setDisplay()
danssurfaceCreate
appelée méthode.