Как приостановить Android VideoView после 4 секунд воспроизведения

Я хочу приостановить воспроизведение видео через 4 секунды воспроизведения, а затем хочу отобразить всплывающее сообщение для пользователя. Может кто-нибудь указать мне в правильном направлении, как приостановить видео через 4 секунды, пожалуйста. Спасибо

V2 Реализована обратная связь @gogothebee {Теперь видео останавливается в позиции 0 (до того, как оно действительно начнется).

public class PlayVideoActivity extends ActionBarActivity {

    public static final String TAG = PlayVideoActivity.class.getSimpleName();
    Bundle bunde;
    Intent intent;
    String content_actual_content;

    VarController vc = new VarController(PlayVideoActivity.this);
    public ImageLoader imageLoader;

    private VideoView mVideoView;
    private MediaController mMediaController;
    ProgressBar pbplay1;

    private boolean isActive;
    private Handler handler;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_video); //playvideo (FullScreen)

        handler = new Handler();

        //Hide Action Bar
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();

        //Toast.makeText(PlayVideoActivity.this, "You're on Video Player with link: " + content_actual_content, Toast.LENGTH_SHORT).show();

        //Set ProgressBar
        pbplay1 = (ProgressBar) findViewById(R.id.pbplay1);

        //Get Link from ImageAdapter
        intent = this.getIntent();
        bunde = intent.getExtras(); 
        content_actual_content = bunde.getString("content_actual_content");

        Toast.makeText(PlayVideoActivity.this, "You're on Video Player with link: " + content_actual_content, Toast.LENGTH_SHORT).show();

        //Initiate Player
        mVideoView = (VideoView) findViewById(R.id.videoview);                      
        mVideoView.setVideoURI(Uri.parse(content_actual_content));
        mVideoView.setMediaController(new MediaController(PlayVideoActivity.this));
        mVideoView.requestFocus();

        mVideoView.setMediaController(mMediaController);

        //new myAsync().execute();

    }//--- end onCreate





    @Override
    protected void onPause() {
        super.onPause();
        isActive = false;
    }

    @Override
    protected void onResume() {
        super.onResume();
        isActive = true;
        mVideoView.requestFocus();
        mVideoView.start();
        scheduleVideoPause(4000);
    }

    private void scheduleVideoPause(int msec) {
        handler.removeCallbacksAndMessages(null);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if(!isActive) {
                    return;
                }
                mVideoView.pause();
                Toast.makeText(PlayVideoActivity.this, "Video has PAUSED at: " + mVideoView.getCurrentPosition(), Toast.LENGTH_SHORT).show();
            }
        }, msec);
    }

Версия 1

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_video); //playvideo (FullScreen)

        //Hide Action Bar
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();

        //Toast.makeText(PlayVideoActivity.this, "You're on Video Player with link: " + content_actual_content, Toast.LENGTH_SHORT).show();

        //Set ProgressBar
        pbplay1 = (ProgressBar) findViewById(R.id.pbplay1);

        //Get Link from ImageAdapter
        intent = this.getIntent();
        bunde = intent.getExtras(); 
        content_actual_content = bunde.getString("content_actual_content");

        Toast.makeText(PlayVideoActivity.this, "You're on Video Player with link: " + content_actual_content, Toast.LENGTH_SHORT).show();

        //Initiate Player
        mVideoView = (VideoView) findViewById(R.id.videoview);                      
        mVideoView.setVideoURI(Uri.parse(content_actual_content));
        mMediaController = new MediaController(PlayVideoActivity.this);
        mVideoView.setMediaController(mMediaController);
        mVideoView.requestFocus();

        mVideoView.start();
        //new myAsync().execute();


        Log.i("**********************", "getCurrentPosition: " + mVideoView.getCurrentPosition());

        if (mVideoView.getCurrentPosition() == 4000) {
            mVideoView.pause();
            Toast.makeText(PlayVideoActivity.this, "Video has PAUSED at: " + mVideoView.getCurrentPosition(), Toast.LENGTH_SHORT).show();
        }





    }//--- end onCreate

person Cho Hee    schedule 18.06.2014    source источник
comment
проверьте: stackoverflow.com/questions/11960730/   -  person Paresh Mayani    schedule 18.06.2014
comment
код, который вы разместили, не работает?   -  person Noya    schedule 18.06.2014
comment
Код работает, но функция паузы НЕ работает.   -  person Cho Hee    schedule 18.06.2014


Ответы (1)


Кажется, что нет никакого способа сделать это легко. Однако мое решение состоит в том, чтобы создать фоновый таймер, который запускается каждые 100 мс (настраивается) и проверяет текущую позицию. Как только оно превышает желаемый порог (в данном случае 4000 мс), видео останавливается. Я знаю, что это не элегантно и не будет работать точно при 4000 мс, но если у кого-то есть идея получше, поделитесь ею. При настройке интервала объединения, если вы хотите максимально приблизиться к 4000 мс, не делайте его слишком низким из соображений производительности.

Это решение также можно подвергнуть рефакторингу, так как оно довольно запутанное, но я хотел показать концепцию в как можно меньшем количестве кода.

private Timer timer;
private boolean isActive;
private VideoView mVideoView;
private final static int POOLING_INTERVAL_MS = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Initiate Player
    mVideoView = (VideoView) findViewById(R.id.videoview);
    mVideoView.setVideoURI(Uri.parse("Your-Video-URI"));
    mVideoView.setMediaController(new MediaController(this));
}

@Override
protected void onPause() {
    super.onPause();
    isActive = false;
    cancelProgressPooling();
}

@Override
protected void onResume() {
    super.onResume();
    isActive = true;
    mVideoView.requestFocus();
    mVideoView.start();
    initVideoProgressPooling(4000);
}

private void initVideoProgressPooling(final int stopAtMsec) {
    cancelProgressPooling();
    timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            mVideoView.post(new Runnable() {
                @Override
                public void run() {
                    if (!isActive) {
                        cancelProgressPooling();
                        return;
                    }
                    if(mVideoView.getCurrentPosition() >= stopAtMsec) {
                        mVideoView.pause();
                        cancelProgressPooling();
                        Toast.makeText(MainActivity.this, "Video has PAUSED at: " + mVideoView.getCurrentPosition(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }, 0, POOLING_INTERVAL_MS);
}

private void cancelProgressPooling() {
    if(timer != null) {
        timer.cancel();
    }
    timer = null;
}
person Community    schedule 18.06.2014
comment
Спасибо за ответ. Я только что попробовал. Но теперь видео останавливается на 0 [PAUSED at: + mVideoView.getCurrentPosition()] перед его запуском. Я опубликовал V2 выше с реализацией из вашего отзыва. - person Cho Hee; 18.06.2014
comment
Тогда я полагаю, что видео не локальное, а загружается из Интернета. Я предположил, что он доступен как ресурс. Я выложу версию, которая будет работать в этом случае. - person ; 18.06.2014
comment
Да, видео загружается из Интернета. @gogothebee большое спасибо за вашу помощь. ;-) - person Cho Hee; 19.06.2014