2012-06-05 70 views
0

由於某種原因,我的媒體播放器在暫停時完成。現在我已經看到另一篇文章說它是異步和300毫秒的差異,我明白了。但我的主要問題是,我在視頻上還剩20秒,暫停後在20秒內耗盡。 這裏是有關的代碼,我可能會搞砸的:MediaPlayer onCompletionListener在暫停時調用

private void initPlayer() 
{ 
    try { 
     if(videoFile != null) 
     { 

      afd = getAssets().openFd(videoFile); 

      instructionVideoPlayer = new MediaPlayer(); 

      instructionVideoPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); 

      instructionVideoPlayer.setDisplay(holder); 

      instructionVideoPlayer.prepare(); 
      Log.i("Instruction Video", "videoPrepared"); 
      instructionVideoPlayer.setOnCompletionListener(instructionVideoComplete); 
      instructionVideoPlayer.setOnPreparedListener(this); 
     } 

    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.i(this.toString(), "IOEXception"); 
     e.printStackTrace(); 
     //initPlayer(); 
    } catch (Exception e) 
    { 
     Log.i("InitPlayer", e.getClass().toString()); 
     e.printStackTrace(); 
    } 

    restoreOverlayState(); 
} 

聽衆:

MediaPlayer.OnCompletionListener instructionVideoComplete = new MediaPlayer.OnCompletionListener() { 

    public void onCompletion(MediaPlayer arg0) { 
     Log.i("onCompletion", "called"); 
     if(!videoFile.contentEquals(LangSelect.INSTRUCTION_05)) 
     { 
      Intent returnIntent = new Intent(); 
      returnIntent.putExtra(LangSelect.ACTION, LangSelect.GO_VIDEO_NEXT); 
      setResult(RESULT_OK, returnIntent); 
      continuePlaying = true; 
      toFinish(); 

     } 
     else 
      toFinish(); 
    } 
}; 

public void onPrepared(MediaPlayer mediaPlayer) 
{ 
    playVideo(); 
} 

的播放和暫停功能

private void playVideo() 
{ 
    instructionVideoPlayer.seekTo(pausedAt); 
    instructionVideoPlayer.start(); 
    restoreOverlayState(); 
} 
private void pauseVideo() 
{ 
    pausedAt = instructionVideoPlayer.getCurrentPosition(); 
    instructionVideoPlayer.pause(); 
} 

private void restoreOverlayState() 
{ 
    prefs = getSharedPreferences(SAVE_PREFS, Context.MODE_PRIVATE); 

    if(prefs.getBoolean(IS_PAUSED, false)) 
    { 
     pauseOverlay.setVisibility(View.VISIBLE); 
     pauseVideo(); 
    } 
    else 
    { 
     pauseOverlay.setVisibility(View.GONE); 
    } 
} 

編輯:這只是發生在Nexus S(2.3.3)我正在測試的其中一款手機。另一個Galaxy S(Froyo)沒有這個錯誤。

回答

0

我想清楚我在做什麼錯了。 OnCompletionListener被調用。問題是我在運行2個媒體播放器時,偶然爲它們設置了onCompletionlistener,因爲我正在調用initPlayer兩次。一旦在surfaceCreated中,再次在o​​nResume()的末尾。無論是銀河S是搞砸了,或者它有奇怪的錯誤檢查,因爲這個問題沒有出現在那裏。

相關問題