2012-10-28 2 views
3

라이브 및 주문형 스트림을 스트리밍 할 미디어 플레이어를 쓰고 있습니다. 그것은 대부분 작동하지만, 어떤 이유로 seekTo (int)가 제대로 작동하지 않습니다. 내 문제는 seekTo (int)를 호출 할 때 onSeekComplete 콜백을 얻지 못한다는 것입니다. 내 onPrepared 콜백에 콜백 메소드를 등록합니다.안드로이드 미디어 플레이어 onSeekComplete가 호출되지 않습니다.

MediaController도 사용하고 있으며 MediaController에 MediaPlayer를 등록했음을 유의해야합니다. 검색 바를 테이핑하여 검색하면 MediaController를 통해 이동하므로 해당 시나리오에서 onSeekComplete 콜백을받습니다. 여기 내 코드가있다.

package com.brockoli.android.hsdroid; 

import java.io.IOException; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Point; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnSeekCompleteListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.Display; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.MediaController; 
import android.widget.MediaController.MediaPlayerControl; 
import android.widget.ProgressBar; 

public class VideoPlayerActivity extends Activity implements MediaPlayer.OnPreparedListener, 
                  MediaPlayer.OnVideoSizeChangedListener, 
                  SurfaceHolder.Callback, 
                  MediaController.MediaPlayerControl, 
                  OnSeekCompleteListener { 

    private MediaPlayer mp; 
    private MediaController mc; 
    private int width = 0; 
    private int height = 0; 
    private SurfaceView surface; 
    private SurfaceHolder holder; 
    private ProgressBar timeline = null; 
    private boolean isPaused = false; 
    private int mCurrentPosition = 0; 

    private Handler handler = new Handler(); 

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

     setContentView(R.layout.video_player); 

     if (getLastNonConfigurationInstance() != null) { 
      mCurrentPosition = (Integer) getLastNonConfigurationInstance();   
     } 

     mc = new MediaController(this); 

     surface = (SurfaceView) findViewById(R.id.surface_video); 
     holder = surface.getHolder(); 
     holder.addCallback(this); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     isPaused = true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     width = getScreenWidth(); 
     height = setHeightBasedOnWidth(); 

     isPaused = false; 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     if (mp != null) { 
      mp.release(); 
      mp = null; 
     } 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     int currentPosition = 0; 
     if (mp != null && mp.isPlaying()) { 
      currentPosition = mp.getCurrentPosition(); 
     } 
     return currentPosition; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     mc.show(); 
     return false; 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     Intent intent = this.getIntent(); 
     String url = intent.getStringExtra("STREAM_ID"); 

     playVideo(url); 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

    } 

    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     LayoutParams lp = surface.getLayoutParams(); 
     lp.width = width; 
     lp.height = height; 
     surface.setLayoutParams(lp); 
     if (width != 0 && height != 0) { 
      holder.setFixedSize(width, height); 
      mc.setMediaPlayer(this); 
      mc.setAnchorView(surface); 

      handler.post(new Runnable() { 

       @Override 
       public void run() { 
        mc.setEnabled(true); 
        mc.show(); 
       } 
      }); 

      Log.d("MEDIAPLAYER", "onPrepared start"); 
      mp.seekTo(mCurrentPosition); 
      //mediaPlayer.start(); 
     } 
    } 

    private void playVideo(String url) { 
      try { 
       if (mp == null) { 
        mp = new MediaPlayer(); 
        mp.setScreenOnWhilePlaying(true); 
        mp.setOnVideoSizeChangedListener(this); 
        mp.setOnSeekCompleteListener(this); 
       } else { 
        mp.stop(); 
        mp.reset(); 
       } 

       mp.setDataSource(url); 
       mp.setDisplay(holder); 
       mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
       mp.setOnPreparedListener(this); 
       mp.prepareAsync(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (SecurityException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 

    @Override 
    public void onVideoSizeChanged(MediaPlayer mediaPlayer, int newWidth, int newHeight) { 
/*  if (width != 0 && height != 0) { 
      holder.setFixedSize(width, height); 
      //mp.seekTo(mCurrentPosition); 
      Log.d("MEDIAPLAYER", "onVideoSizeChanged start"); 
      //mediaPlayer.start(); 
     } 
*/  
    } 

    private Point getScreenSize() { 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     return size; 
    } 

    private int getScreenWidth() { 
     return getScreenSize().x; 
    } 

    private int getScreenHeight() { 
     return getScreenSize().y; 
    } 

    private int setHeightBasedOnWidth() { 
     if (getScreenWidth() > getScreenHeight()) { 
      return getScreenHeight(); 
     } 
     return (int) (getScreenWidth()/1.6); 
    } 

    @Override 
    public boolean canPause() { 
     return true; 
    } 

    @Override 
    public boolean canSeekBackward() { 
     return true; 
    } 

    @Override 
    public boolean canSeekForward() { 
     return true; 
    } 

    @Override 
    public int getBufferPercentage() { 
     return 0; 
    } 

    @Override 
    public int getCurrentPosition() { 
     return mp.getCurrentPosition(); 
    } 

    @Override 
    public int getDuration() { 
     return mp.getDuration(); 
    } 

    @Override 
    public boolean isPlaying() { 
     return mp.isPlaying(); 
    } 

    @Override 
    public void pause() { 
     mp.pause(); 
    } 

    @Override 
    public void seekTo(int pos) { 
     mp.seekTo(pos); 
    } 

    @Override 
    public void start() { 
     Log.d("MEDIAPLAYER", "MediaController start"); 
     mp.start(); 
    } 

    @Override 
    public void onSeekComplete(MediaPlayer mp) { 
     mp.start(); 
    } 

} 
+0

컨트롤이 setOnSeekCompleteListener() 호출에 전혀 도달했는지 확인 했습니까? –

+0

setOnSeekCompleteListener()에 중단 점을 설정하고 충돌합니다. 또한 메모리에있는 내 미디어 플레이어 개체를 주시하고 onSeekCompleteListener 멤버가 null이 아닌 개체로 설정되어있는 것을 볼 수 있습니다.이 이벤트는 리스너를 설정했음을 알려줍니다. – brockoli

답변

1

때때로 MediaPlayer는 약간 다른 방식으로 구현됩니다. onInfo 리스너를 확인하여 피드백을 받고 있는지 확인하십시오.

덧글을 편집 :
나는 그것을 시도하고 내 응용 프로그램에서 나를 위해 작동하지 않았다. 나를 둘러싼 방법은 특히 seek 이벤트가 시작될 때 미디어가 이미 재생 중이면 currentPosition이 다시 증가하는 것을 확인하면 검색이 완료되었음을 알 수 있습니다.

+0

나는 내 bufferListener, onSeekCompleteListener, onErrorListener 등을 등록하는 곳과 동일한 위치에 onInfoListener 콜백을 등록했으며, 결코 호출되지 않습니다. mp.setInfoListener (new MediaPlayer.OnInfoListener() {@ Override Public void onInfo (...}) 아직 운이 없다. 내가 어디에서 잘못 될지 알 수 없다. – brockoli

+0

당신이 아니야. 당신의 상황을 묘사 한 집에있는 버그 보고서를 읽었습니다 – ajacian81

+0

흠 .. 좋아요, 더 낮은 API 레벨로 컴파일하려고합니다 확실히 어떤 점에서 작동해야합니다 – brockoli