49 votes

Videoview Mise en pause et reprise

Je suis nouveau dans le développement Android et je suis en train de programmer un jeu. Mon jeu a des cutsceens qui sont joués avant le début de chaque niveau, cutsceens qui sont faits par le biais de videoview. Mon problème est qu'en cas de pause de l'application, le cutsceen recommence depuis le début lorsqu'il est repris.

    @Override
public void onPause() {
    super.onPause();
    video.pause();
}
@Override
public void onResume()
{
    super.onResume();
    video.resume();
}

Notre problème est que la vidéo ne reprend pas à partir de l'endroit où nous l'avons mise en pause, mais à partir du début.

67voto

Sanket Patel Points 1030

Vous pouvez utiliser ce

@Override
public void onPause() {
    Log.d(TAG, "onPause called");
    super.onPause();
    stopPosition = videoView.getCurrentPosition(); //stopPosition is an int
    videoView.pause();
}
@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume called");
    videoView.seekTo(stopPosition);
    videoView.start(); //Or use resume() if it doesn't work. I'm not sure
}

poste original

4 votes

Ça ne marche pas pour moi. De toute façon, ça ne commence qu'au début... Android 4.4.4

2 votes

La solution ci-dessus fonctionne dans le flux le plus simple. @JohnyTex exemples.javacodegeeks.com/Android/Android-videoview-example bel exemple avec code, peut vous aider.

0 votes

Cela n'a pas fonctionné pour moi sur un Samsung Galaxy S5 avec 5.0. La solution ci-dessous proposée par @Khang .NT, en revanche, fonctionne parfaitement bien.

30voto

Khang .NT Points 1053

Il ne faut pas utiliser video.pause(), video.resume(), car lorsque vous les appelez, les données de la mémoire tampon seront perdues. C'est aussi la raison pour laquelle VideoView joue au DÉBUT chaque fois que vous appelez video.resume(). Voyez-le : VideoView onResume perd la partie de la vidéo mise en mémoire tampon

Solution :

VideoView videoView;
MediaPlayer mp;

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                this.mp = mp;
            }
        });

public void pause(){
    //NOT videoview.pause(); Needn't save Stop position
    if (mp != null){
       mp.pause();
    }
}

public void resume(){
    //NOT videoview.resume();
    if (mp != null){
       mp.start(); //Video will begin where it stopped
    }   
}

0 votes

Pouvez-vous s'il vous plaît expliquer où nous devons utiliser ces pause() y resume() méthodes ?

0 votes

Je ne sais pas, j'ai lu la classe VideoView, c'est très simple, il suffit d'implémenter le lecteur multimédia avec SurfaceView, je ne sais pas pourquoi VideoView efface les données de la mémoire tampon chaque fois que nous Pause().

0 votes

Cela a bien fonctionné sur le Galaxy S5 avec la version 5.0.

20voto

Flynn81 Points 1679

Au lieu de resume() utiliser start() encore.
Il commencera la lecture à partir du point où vous avez interrompu la vidéo.

16 votes

Non, ça ne l'est pas. Il commence au début d'une vidéo.

0 votes

Cela ne fonctionne pas pour moi dans la version 5.1.1, mais cela permet de revenir au début.

3 votes

C'est un peu confus, mais start() après pause() fonctionne et resume() ne fonctionne pas sur le Nexus Player (5.1.1).

13voto

Dans OnPause vous pouvez obtenir la position actuelle .

length=mVideoView.getCurrentPosition();

et utilisation de la valeur de la longueur dans OnResume ().

mVideoView.seekTo(length);
mVideoView.start()

fonctionne bien.

12 votes

Cela ne me semble pas précis, quand j'adopte cette approche. Il semble qu'il saute un peu en arrière dans la vidéo, lorsque je la démarre après avoir été mise en pause.

0 votes

@Teilmann même frère, que faire ?

0 votes

Je l'ai ajouté et ça m'a aidé. J'ai résumé 10 secondes mVideoView.seekTo(stopPosition+(10*1000)) ;

1voto

Keshav Gera Points 1892
    int stopPosition;   // Globally declare class level...
    @Override
    public void onPause() {
        super.onPause();  
        onPauseVideoView();
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.e("WatchVideoAd Fragment", "onPause called");

        onResumeVideoView();
    }

    private void onPauseVideoView() {
        stopPosition = videoview.getCurrentPosition(); //stopPosition is an int
        videoview.pause();
    }

    private void onResumeVideoView() {
        videoview.seekTo(stopPosition);
        videoview.start(); //Or use resume() if it doesn't work. I'm not sure
    }

onHiddenChanged en cas de Fragment

  @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            if (getActivity() != null) {
                ((AppActivity) getActivity()).updateTitle(getResources().getString(R.string.title_game));
            }
            Log.e("keshav", "WatchVideoAd Fragment  ");
            onResumeVideoView();

        } else {

            Log.e("keshav", "WatchVideoAd Fragment else ");
            onPauseVideoView();
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X