0

私は1つのアクティビティ(プレイヤと呼ばれます)にメディアプレーヤーを持ち、プレイヤが親アクティビティのミニチュアビューに閉じたときから連続したビデオ再生をサポートしたいと考えています。MediaPlayerとSurfaceViewで複数のアクティビティを処理する

これはオーディオのみの場合にはうまくできますが、mediaPlayer.setDisplay()経由でSurfaceViewを接続すると問題が発生します。

SurfaceViewを最初からうまく取り付けることができますが、プレーヤーのアクティビティを閉じると問題が発生します。変更を加えないと、mediaPlayerは何らかの理由で通常の役に立たないエラー(1、-19など)で何らかの理由でエラー状態になります。

Player SurfaceViewが破損して動作していると思われるとき、私はsetDisplay 。しかし何らかの理由で、ビデオストリームをリセットします。私は何が起きているのかを調べるために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

はそれを考え出したどうやらアクティビティを閉じるには、オーディオの損失が発生しますAudioManager.AUDIOFOCUS_LOSSの値を持つ。

私は良いAndroidの市民されていたので、それはメディアプレーヤーを解放するように設定した。しかし、オーディオは、その後、私のメディアプレーヤーをリセットし、したがってから始める取得させることになる取り戻したことになります初め

これはsetDisplay()メソッドのまわりで発生したばかりです。

関連する問題