2014-10-15 6 views
2

갤럭시 탭 3의 Android 4.4에서 비디오 재생에 문제가 있습니다. 이전 Android 버전 4.2에서는 문제가 발생하지 않았습니다.Android 4.4에서 동영상 루핑 대신 MediaPlayer가 정지 함

문제

내가 루프에서 비디오를 재생하고 있습니다. 이것은 Tab 3이 Android 4.4로 업데이트 될 때까지 모든 사용자에게 매우 효과적이었습니다. 그 이후로 비디오는 첫 번째 루프 이후에 정지합니다 (정확한 비디오의 첫 번째 프레임에 붙어 있습니다).

내가 그 동작을 재현 할 수 있으며, 순간에 비디오 내 로그 캣은 다음과 같은 출력으로 전체 점점 시작 정지 :

16:25:25.239 14589-14601/my.app V/MediaPlayer? back from callback 
16:25:25.499 14589-14686/my.app V/MediaPlayer? message received msg=7, ext1=0, ext2=0 
16:25:25.499 14589-14686/my.app V/MediaPlayer? unrecognized message: (7, 0, 0) 
16:25:25.499 14589-14686/my.app V/MediaPlayer? callback application 
16:25:25.499 14589-14686/my.app V/MediaPlayer? back from callback 
16:25:25.519 14589-14602/my.app V/MediaPlayer? message received msg=4, ext1=0, ext2=0 
16:25:25.519 14589-14602/my.app V/MediaPlayer? Received seek complete 
16:25:25.519 14589-14602/my.app V/MediaPlayer? All seeks complete - return to regularly scheduled program 
16:25:25.519 14589-14602/my.app V/MediaPlayer? callback application 
16:25:25.519 14589-14602/my.app V/MediaPlayer? back from callback 
16:25:25.519 14589-14601/my.app V/MediaPlayer? message received msg=6, ext1=0, ext2=0 
16:25:25.519 14589-14601/my.app V/MediaPlayer? Received MEDIA_STARTED 
16:25:25.519 14589-14601/my.app V/MediaPlayer? callback application 
16:25:25.519 14589-14601/my.app V/MediaPlayer? back from callback 
16:25:25.789 14589-14686/my.app V/MediaPlayer? message received msg=7, ext1=0, ext2=0 
16:25:25.789 14589-14686/my.app V/MediaPlayer? unrecognized message: (7, 0, 0) 
16:25:25.789 14589-14686/my.app V/MediaPlayer? callback application 
16:25:25.789 14589-14686/my.app V/MediaPlayer? back from callback 
16:25:25.809 14589-14602/my.app V/MediaPlayer? message received msg=4, ext1=0, ext2=0 
16:25:25.809 14589-14602/my.app V/MediaPlayer? Received seek complete 

이 코드는

은 다음 (simplyfied) 활동은 가정된다 동영상을 재생할 수 있습니다. MediaPlayer.OnErrorListener() 및 MediaPlayer.OnInfoListener()는 호출되지 않습니다.

public class VideoActivity extends Activity { 

    private MediaPlayer mediaPlayer; 
    private String videoPath = "some path obtained from the system"; 

    // [...] 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mediaPlayer = new MediaPlayer(); 
     startMovie(); 
    } 

    private void startMovie(){ 

     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.setLooping(true); 
     mediaPlayer.setDataSource(videoPath); 
     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
       mp.start(); 
       mp.seekTo(0); 
      } 
     }); 
     mediaPlayer.prepare(); 
    } 

} 

비디오

내가 중지하고 영화를 시작하기 전에 플레이어를 재설정 이유입니다, 활동의 수명 기간 동안 다른 비디오 파일 경로에 여러 번 시작할 수 있습니다.

지금까지 인터넷에서 발견 한 유일한 해결책은 MediaPlayer가 GC에 의해 수집되지 않았는지 확인하는 것이 었습니다. (이는 메소드 로컬 객체로 만들지 않음으로써) WakeLock을 구현합니다. 효과.

누구든지 나를 도울 수 있고 올바른 방향으로 나를 가리킬 수 있습니까? 고맙습니다! 솔루션보다 해결

답변

3

더, 나는 하지MediaPlayersetLooping 방법을 사용하여 비디오를 반복 끝났다. 대신 MediaPlayerOnCompletion 콜백으로 동영상을 다시 시작합니다. 시도한 후에 이것이 내가 테스트 할 모든 장치에서 작동하도록하는 유일한 방법이었습니다.

public class VideoActivity extends Activity { 

    private MediaPlayer mediaPlayer; 
    private String videoPath = "some path obtained from the system"; 

    // [...] 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mediaPlayer = new MediaPlayer(); 
     startMovie(); 
    } 

    private void startMovie(){ 

     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(videoPath); 

     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
       mp.start(); 
       mp.seekTo(0); 
      } 
     }); 

     mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       startMovie(); 
      } 
     }); 

     mediaPlayer.prepare(); 
    } 

} 

그래도 누군가가 그 문제에 대한 유효한 해결책을 가지고 있다면 나는 해당 답을 올바르게 표시하게되어 기쁩니다.

+0

더 좋은 해결책이 있습니까? 애니메이션 루프가 있는데 파일 경로를 다시로드하는 동안 반 초 동안 멈추지 않으려합니다. 감사합니다 – goodm

+0

아니, 더 나은 해결책을 찾지 못했고 이것을 사용하여 끝났다. 제 경우에는 눈에 띄는 지연이 없었습니다 (그러나 비디오는 꽤 짧았습니다). –

+0

이것에 대한 최신 정보? 이것은 또한 나를 위해 문제를 일으키는 것입니다 그리고 나는 S6를 사용하고 있습니다. – AndyRoid