2016-06-21 6 views
0

У меня есть VideoView, который воспроизводится из внутренней памяти. Пока мое видео воспроизводит журналы VideoView MediaPlayer: error (1, -1004). У меня есть onErrorListener, прикрепленный к VideoView, откуда я хотел бы управлять этой ошибкой. То, что я собираюсь сделать, состоит в том, чтобы получить последнюю позицию (от getCurrentPosition()) и снова начать мой игрок с этой позиции, используя seekTo(int position). Мой видеофайл действителен (подтверждается игрой на других игроках). Моя проблема теперь в том, чтобы получить последнюю действительную позицию из VideoView. Вызов getCurrentPosition() из onError (MediaPlayer mp, int what, int extra) возвращает 0, когда я делаю mp.getCurrentPosition/mVideoView.getCurrentPosition() (совершенно справедливо). Как мне отслеживать текущую позицию игрока во время игры?Android - VideoView, получив текущую позицию в качестве видео?

Вот мой код:

mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       switch (what) { 
        case MediaPlayer.MEDIA_ERROR_UNKNOWN: 
         Log.v("error", "media error unknown"); 
         mediaErrorExtra(mp, extra, path); 
         break; 
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED: 
         Log.v("error", "media error server died"); 
         mediaErrorExtra(mp, extra, path); 
         break; 
       } 
       return true; 
      } 
     }); 

private void mediaErrorExtra(MediaPlayer mp, int extra, String path){ 
     switch(extra){ 
      case MediaPlayer.MEDIA_ERROR_IO: 

       if(!mp.isPlaying()){ 
        Integer currentposition = mVideoView.getCurrentPosition(); 
        if(currentposition != null){ 
         Log.v("currentpos",Integer.toString(currentposition)); 
        } 
        mVideoView.setVideoPath(path); 
        mVideoView.start(); 
        //mVideoView.seekTo(currentposition); 
       } 
       break; 
      case MediaPlayer.MEDIA_ERROR_MALFORMED: 
       Log.v("error extra","media error malformed"); 
       break; 
      case MediaPlayer.MEDIA_ERROR_UNSUPPORTED: 
       Log.v("error extra","media error unsupported"); 
       break; 
      case MediaPlayer.MEDIA_ERROR_TIMED_OUT: 
       Log.v("error extra","media error timed out"); 
       break; 
     } 
    } 

Кроме того, есть ли слушатель, который обеспечивает текущую позицию игрока в то время как он играет? Я мог бы использовать while(isPlaying()){int currentposition = mVideoView.getCurrrentPosition()}, но я полагаю, что это плохой способ обойти вещи. Любое предложение было бы наиболее оценено. Заранее спасибо.

ответ

0

Отвечая на мой вопрос:

ScheduledExecutorService помогли решить эту проблему:

Вот как Я получаю текущую позицию, когда игрок играет:

ScheduledExecutorService mScheduledExecutorService; 
    int mCurrentposition = 0; 
    Runnable UpdateCurrentPosition = new Runnable(){ 

     @Override 
     public void run() { 
      mCurrentposition = mVideoView.getCurrentPosition(); 
     } 
    }; 

    @Override 
    protected void onCreate(){ 
     ... 
     mScheduledExecutorService = new ScheduledExecutor(1); 

     mScheduledExecutorService.scheduleWithFixedDelay(new Runnable(){ 
      @Override 
      public void run() { 
       mVideoView.post(UpdateCurrentPosition); 
      } 
     },3000,1000,TimeUnit.MILLISECONDS); 
    } 
+0

не может решить символ 'ScheduledExecutor' – NarendraJi

0

Вы находитесь на правильном пути с изображением while, но для этого потребуется немного больше уточнения, потому что время, вероятно, полностью заблокирует пользовательский интерфейс.

Так что вам следует использовать Handler, который будет вызывать проверку каждые 1 секунду для позиции MediaPlayer, я думаю, 1 сек вполне разумно.

Я использовал этот подход для реализации пользовательского SeekBar для MediaPlayer, и он отлично работает.

+0

Спасибо за это, я получаю текущее положение таким образом, но теперь стрелка поиска MediaController не появляется .. Нужно обойти это тоже ... – user1841702

0

Я показываю обработчик, который я использовал ...

 private double currentTime = 0; 
    private Handler mHandler = new Handler(); 

    //update Seekbar on UI thread 
    public void updateProgressBar() { 
     if (mHandler != null) { 
      mHandler.postDelayedUpdateProgress 100); 
     } 
    } 

private Runnable UpdateProgress = new Runnable() { 
     public void run() { 
     currentTime = mediaPlayer.getCurrentPosition(); 
     txt.setText(String.format("%d min, %d sec", 
     TimeUnit.MILLISECONDS.toMinutes((long) startTime), 
     TimeUnit.MILLISECONDS.toSeconds((long) startTime) - 
     TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. 
     toMinutes((long) startTime))) 
     ); 
     seekbar.setProgress((int)startTime); 
     myHandler.postDelayed(this, 100); 
     } 
    }; 

Вы должны использовать обработчик ..