2012-09-27 11 views
5

W przypadku niestandardowego widoku wideo musiałem zastąpić MediaController (aby zmienić projekt przycisków i połączyć się z przyciskami wstrzymać/odtworzyć selektor). Sytuacja jest następująca: po zatrzymaniu wideo i włączeniu aplikacji, a następnie ponownym odtworzeniu, wideo rozpoczyna się od nowa, a nie od momentu, w którym zostało zawieszone, i dlatego pojawiło się pytanie: jak rozpocząć odtwarzanie wideo z miejsca, w którym zostało zatrzymane? Co muszę zmienić w VideoActivity?Odtwarzanie wideo ze stanu pauzy w VideoView

public class VideoActivity extends Activity { 

VideoView videoView; 

VkMediaController mc; 

private static final String CURRENT = "duration"; 

private static final String URL = "url"; 

private Uri mURI; 

private int mCurrentPosition = -1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.video_view_player); 
    videoView = (VideoView) findViewById(R.id.videoViewplayer); 
    mc = new VkMediaController(this); 
    mURI = getIntent().getData(); 
    if (savedInstanceState != null) { 
     mURI = Uri.parse(savedInstanceState.getString(URL)); 
     mCurrentPosition = savedInstanceState.getInt(CURRENT); 

    } 
    videoView.setMediaController(mc); 
    videoView.setVideoURI(mURI); 
    videoView.requestFocus(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    videoView.start(); 
    if (mCurrentPosition != -1) { 
     videoView.seekTo(mCurrentPosition); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(CURRENT, videoView.getCurrentPosition()); 
    outState.putString(URL, mURI.toString()); 
    super.onSaveInstanceState(outState); 
} 

}

+0

jaki jest błąd/problem? co jest nie tak z tym kodem? – njzk2

+0

brak błędów, ale nie rozpoczyna się odtwarzanie z bieżącej pozycji, a od początku – ricky

+0

sprawdziłeś wartość mCurrentPosition? – njzk2

Odpowiedz

14

Myślę, że problemem jest to, że videoView.getCurrentPosition() zawsze zwraca 0 gdy dzwonisz wewnątrz onSaveInstanceState(Bundle outState), cos w tym czasie film już zresetować, tak nazywają videoView.getCurrentPosition() gdy onPause(), to zwróci Ci pożądany wartość.

+0

dzięki, próbuję to zrobić – ricky

+0

chronione void onPause() { videoView.pause(); videoView.getCurrentPosition(); super.onPauza(); } czy to prawda? – ricky

+0

i muszę zachować mCurrentPosition w onSaveInstanceState (Bundle outState)? – ricky

2

Miałem ten sam problem. Myślałem, że zrobiłem wszystko dobrze, ale nie działało. Następnie zmieniłem kolejność, więc najpierw zadzwonię pod numer VideoView.seekTo(), a następnie VideoView.start(). To się udało. Mam też tam VideoView.requestFocus(), ale nie wiem, czy to ma znaczenie.

videoPlayer.requestFocus(); 
videoPlayer.seekTo(position); 
videoPlayer.start(); 

Więc jeśli jesteś pewien, że pozycja position ma odpowiednią wartość, może to być Twoja odpowiedź. Możesz nie być w stanie wyszukać, kiedy wideo nie jest załadowane. Wdrożyć onPreparedListener w ten sposób:

public class VideoActivity extends Activity implements OnPreparedListener { 
    VideoView videoPlayer; 
    int position; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState!=null){ 
    position=savedInstanceState.getInt("pos") 
    } 
    // setting up the videoview 
    setContentView(R.layout.activity_video); 
    getIntent().getExtras().getString("url"); 
    Uri videouri = Uri.parse(getIntent().getExtras().getString("url")); 
    videoPlayer = (VideoView) findViewById(R.id.videoView); 
    videoPlayer.setOnPreparedListener(this); 
    videoPlayer.setKeepScreenOn(true); 
    videoPlayer.setVideoURI(videouri); 

    } 

    /** 
    * Start the plaback when the video is loaded 
    * 
    * @param mp 
    * @see android.media.MediaPlayer.OnPreparedListener#onPrepared(android.media.MediaPlayer) 
    */ 
    public void onPrepared(MediaPlayer mp) { 
    //this is a TextView infront of the VideoView which tells the User the Video is loading- hide that 
    findViewById(R.id.tv_video_load).setVisibility(View.GONE); 

    videoPlayer.requestFocus(); 
    videoPlayer.seekTo(position) 
    videoPlayer.start(); 
} 
} 
+0

Wywołujesz te metody w onCreate() lub onStart()? – ricky

+0

o masz rację. Zaimplementowałem OnPreparedListener i wszystko to jest w metodzie onPrepared. Ma sens, abyś nie szukał, jeśli wideo nie jest już załadowane. –

+0

Nazwałam te metody w onStar, to prawda? – ricky

Powiązane problemy