0

하나의 활동 (플레이어라고 함)에 미디어 플레이어가 있고 플레이어가 부모 활동의 축소판보기로 닫힐 때부터 연속적인 비디오 재생을 지원할 수 있기를 바랍니다.MediaPlayer 및 SurfaceView 여러 활동 이상

오디오 만 인 경우이 작업을 수행 할 수 있습니다. MediaPlayer.setDisplay()를 통해 SurfaceView를 연결할 때 문제가 있습니다.

처음에는 SurfaceView를 잘 붙일 수 있지만 플레이어 활동을 닫으면 문제가 시작됩니다. 변경하지 않으면 보통 도움이되지 않는 오류 (1, -19)로 인해 mediaPlayer가 오류 상태가됩니다.

플레이어 SurfaceView가 파괴되어 작동하는 것처럼 보이면 setDisplay (null)를 사용하려고했습니다. . 그러나 어떤 이유로 그것은 비디오 스트림을 재설정합니다. 무슨 일이 일어나고 있는지 알아 내려고 seekTo()를 시도했지만 seekTo()가 호출되지 않습니다. 나는 또한 생각할 수있는 모든 곳에서 로깅 문장을 넣었지만 아무것도 트리거되지 않았습니다.

왜 setDisplay (null)로 인해 내 비디오 스트림이 다시 시작됩니까? 여기

는 (이상한 물건 중 일부는 나를 isReallyPlaying (같은 문제를 해결하기 위해 노력에서 내 현재 MediaPlayer를 코드입니다()).

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
    private ScheduledFuture beeperhandle; 

    private boolean isPaused = false; 
    private BaseMedia currentMedia; 

    private PlaybackService.RepeatStatus repeatStatus = PlaybackService.RepeatStatus.REPEAT_NONE; 

    public void startMedia(BaseMedia model, Integer position) { 
     Timber.d("Starting media"); 
     startBeeper(); 
     isPaused = false; 
     lastBeep = -1; 
     currentMedia = model; 

     if (position != null) { 
      seekTo(position); 
     } 
     super.start(); 
    } 

    public BaseMedia getCurrentMedia() { 
     return currentMedia; 
    } 



    @Override 
    public void start() throws IllegalStateException { 
     Timber.e("Invalid start called, should request startSong or startVideo"); 
    } 

    private int lastBeep = -1; 

    // Because isPlaying is returning false and canceling the beeper. Probably has something to do with the surfaceview being destroyed 
    private boolean isStillPlaying() { 
     if (lastBeep != getCurrentPosition()) { 
      lastBeep = getCurrentPosition(); 
      return true; 
     } 
     return false; 
    } 

    private final Runnable seekBarCheck = new Runnable() { 
     public void run() { 

      if (isStillPlaying() && !beeperhandle.isCancelled()) { 
       EventBus.getDefault().post(new MusicStatusTimeEvent(
         currentMedia, true, GevaldMediaPlayer.this)); 
      } else { 
       Timber.d("Canceling Beeper, !isPlaying"); 
       beeperhandle.cancel(true); 
      } 
     } 
    }; 

    private void startBeeper() { 
     Timber.d("Starting Beeper"); 
     beeperhandle = scheduler.scheduleAtFixedRate(seekBarCheck, 100, 100, TimeUnit.MILLISECONDS); 
    } 

    @Override 
    public void seekTo(final int msec) throws IllegalStateException { 
     Timber.d("Seeking to " + msec); 
     if (beeperhandle != null) { 
      Timber.d("Canceling beeper in prep for seek"); 
      beeperhandle.cancel(true); 
     } 
     setOnSeekCompleteListener(new OnSeekCompleteListener() { 
      @Override 
      public void onSeekComplete(MediaPlayer mp) { 
       Timber.d("Seek complete to: " + msec); 
       startBeeper(); 
      } 
     }); 
     super.seekTo(msec); 
    } 


    @Override 
    public void stop() throws IllegalStateException { 
     super.stop(); 
     Timber.d("Stopping media"); 
     doStop(); 
    } 

    private void doStop() { 
     if (beeperhandle != null) { 
      Timber.d("Canceling beeper, doStop"); 
      beeperhandle.cancel(true); 
     } 
     isPaused = false; 
    } 

    @Override 
    public void pause() throws IllegalStateException { 
     Timber.d("Pause requested"); 
     if (beeperhandle != null) { 
      Timber.d("Canceling beeper, pause"); 
      beeperhandle.cancel(true); 
     } 
     doStop(); 
     EventBus.getDefault().post(new MusicStatusStoppedEvent(this)); 
     super.pause(); 

    } 

    public boolean isPaused() { 
     return isPaused; 
    } 

답변

0

이 그것을 알아 냈 분명히 활동을 닫는는 오디오 손실이 발생

나는 안드로이드 시민 이었기 때문에 미디어 플레이어를 출시 할 예정 이었지만 오디오가 재생되면 미디어 플레이어가 재설정되어 결국 처음.

setDisplay() 메서드 주위에서 발생했습니다.