2013-04-02 9 views
21

Ich verwende eine VideoView-Komponente, um Videos abzuspielen. Ich kann die VideoView-Anzeige nicht löschen, nachdem ich stopPlayback() manuell aufgerufen habe. Ich möchte das VideoView so zurücksetzen, dass der ursprüngliche Hintergrund sichtbar ist.Android VideoView clear display nach stopPlayback()

  1. Ein Video in einer VideoView-Komponente wiedergeben.
  2. Wählen Sie ein neues Video zum Abspielen.
  3. Der VideoView bleibt im letzten Frame des ersten Videos hängen, bis das nächste Video startet. Wenn beim nächsten Video ein Fehler auftritt, bleibt das statische Bild aus dem ersten Video dort hängen.
  4. Wenn ich das Video zum Abschluss-Status abspielen lasse, wird die Anzeige gelöscht.

Der Code Ich verwende:

private VideoView videoViewer = null; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    if (videoViewer != null) { 
    videoViewer.setOnPreparedListener(new OnPreparedListener()); 
    } 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    } 
} 

Beachten Sie, dass auf der VideoView.java Quelle basiert, stopPlayback() nimmt die folgende Aktion auf dem darunterliegenden Mediaplayer:

public void stopPlayback() { 
    if (mMediaPlayer != null) { 
    mMediaPlayer.stop(); 
    mMediaPlayer.release(); 
    mMediaPlayer = null; 
    } 
} 

Antwort

9

Die Lösung, auf die ich mich eingelassen habe, es sei denn jemand kann einen besseren anbieten, ist setBackgroundResource zu verwenden, der seltsamerweise genannt wird, da er scheinbar die Vordergrundressource ändert.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    // Set the background back to the drawable resource to clear the current video when switching to a new one. 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    // Clear the background resource when the video is prepared to play. 
    videoViewer.setBackgroundResource(0); 
    } 
} 

Die ziehbar Ich Referenzierung ist eine einfaches layer-list mit einem benutzerdefinierten blauen Hintergrund und einem zentrierten Logo-Bild.

ziehbar \ viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
    <shape android:shape="rectangle"> 
     <solid android:color="@color/custom_blue" /> 
    </shape> 
    </item> 
    <item> 
    <bitmap android:src="@drawable/img_logo" 
     android:gravity="center" /> 
    </item> 
</layer-list> 

Alternativ war ich auch in der Lage setZOrderOnTop zu verwenden, um zu steuern, wo die Oberflächenansicht platziert ist (Sie können auch eine andere Sicht auf dem Videoviewer definieren könnte und schalten Sie die Sichtbarkeit, die Fahrt):

videoViewer.setZOrderOnTop(false); 
videoViewer.setZOrderOnTop(true); 

Alternativ auch setBackgoundColor verwende ich könnte das gleiche wie setBackgroundResource zu erreichen:

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue)); 
videoViewer.setBackgroundColor(Color.TRANSPARENT); 
+0

Wenn Ich mache das, die nächste Wiedergabe zeigt immer noch das letzte Bild des vorherigen. Irgendwelche Ideen, warum das passiert? – slhck

+0

Der tatsächliche Videoframe wird auf einer Oberfläche "unterhalb" des VideoViews gezeichnet. Wenn Sie den Hintergrund auf VideoView einstellen, wird der Rahmen ausgeblendet, aber nicht gelöscht.Wenn der Hintergrund gelöscht ist, ist der alte Rahmen noch vorhanden. – William

12

Für mich, was funktionierte, war einfach zu verstecken dann zeigen Sie die VideoView mit setVisibility.

public void clearCurrentFrame() { 
    videoView.setVisibility(GONE); 
    videoView.setVisibility(VISIBLE); 
} 

Das war, weil ich die VideoView werden transparent, nicht eine Farbe wollte. Die Einstellung des Hintergrunds auf transparent funktioniert nicht - der Videoframe wird weiterhin angezeigt.

+0

Ich habe gerade eine vorgeschlagene Bearbeitung von einem anonymen Benutzer erhalten, der sagt, dass "videoView.stopPlayback();" als letzte Codezeile eingefügt werden soll. Ich kann nicht bestätigen, dass es notwendig ist, obwohl das Video bereits gestoppt werden muss, damit meine Antwort funktioniert. Ich wollte es nur hier lassen, falls es irgendjemandem hilft :) – William

1

Nun, für mich keine der Lösungen aus diesem Thread gearbeitet, so habe ich versucht, etwas anderes und unten ist die Lösung, die für mich gearbeitet

new Handler().postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     mVideoViewPlayList.setVisibility(View.GONE); 
     mVideoViewPlayList.setVisibility(View.VISIBLE); 
     mVideoViewPlayList.setVideoURI(Uri.parse(path)); 
    } 
}, 500); 
+0

Nichts für ungut. Ich frage mich wirklich, was diese Zeilen bedeuten. mVideoViewPlayList.setVisibility (View.GONE); mVideoViewPlayList.setVisibility (View.VISIBLE); –

+2

@PsyCoder In einigen Geräten wurde mVideoViewPlayList.setVideoURI (Uri.parse (Pfad)) erst wirksam, wenn sich die Sichtbarkeit mindestens einmal geändert hat! –

+0

Vielen Dank für die Erklärung. Es könnte eines Tages meine Zeit sparen :) –

0

nur diesen Code:

videoView.setVideoURI(null); 
+0

Bitte fügen Sie weitere Details zu Ihrer Antwort hinzu! –

+2

java.lang.NullPointerException: uriString es erstellt meine app, wenn ich setUrl null. –

+0

Funktioniert für mich danke –