0

我有一个活动(称为播放器)媒体播放器,我希望能够从当玩家被关闭到父活动的一个缩影视图支持连续播放视频。的MediaPlayer和SurfaceView在多个活动

我能够做到这一点就好了,当它仅仅是音频,问题的关键在于,当我通过mediaPlayer.setDisplay附加SurfaceView();

我最初附上SurfaceView就好了,但是当我关闭了玩家活动的问题开始。如果我不做任何更改,MediaPlayer会以某种方式与通常无用的错误(1,-19)一起被抛入错误状态中。

我尝试使用setDisplay(null)当播放器SurfaceView被销毁似乎工作。但由于某种原因,它会重置视频流。我已经尝试重写seekTo()以找出发生了什么,但seekTo()没有被调用。我也把我能想到的日志声明放在任何地方,但没有任何事情会被触发。

为什么会setDisplay(空)引起我的视频流重新启动吗?

这是我目前的MediaPlayer的代码(有些怪异的东西是我要解决的问题(如isReallyPlaying()):

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

想通了显然收盘活动导致音频丢失价值AudioManager.AUDIOFOCUS_LOSS

因为我是一个很好的Android公民,它被设置为发布媒体播放器,但音频会被重新获得,这将导致我的媒体播放器被重置,因此从

刚刚发生这种情况,这发生在setDisplay()方法的周围。