2015-01-19 4 views
0

Я использую MediaPlayer и SurfaceView для потоковой передачи видео с сервера. Однако видео играет хорошо, если активность переходит в состояние «приостановлено», например. когда пользователь нажимает кнопку «домой» или последнюю кнопку, «При возобновлении активности плеера SurfaceView становится черным. Я знаю, когда вы покидаете активность, поверхностьView разрушается, и при возобновлении она создается снова, так как обходной путь я сохранил текущую позицию игрока в onPause() активности, и когда действие возобновляется, я ищу игрока в этой позиции. Это тоже не сработало.SurfaceView чернет - MediaPlayer Android

Итак, мой вопрос заключается в том, как я могу заставить surfaceView сохранять рамку/изображение, которое он отображал, когда пользователь выходит из действия?

public class VideoPlayer extends Activity implements SurfaceHolder.Callback, OnPreparedListener { 


    private long PREV_PLAYER_POS; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_videoplayer); 

     mDecorView = getWindow().getDecorView(); 
     mediaController = new VideoControllerView(this, mDecorView); 

     handler = new Handler(); 
     Intent intent = getIntent(); 
     usedURL = intent.getExtras().getString("vidURL"); 

     vidID = intent.getExtras().getString("id"); 
     mProgressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     mProgressBar.setVisibility(ProgressBar.VISIBLE); 

     mContext = this; 

     surfView = (SurfaceView) findViewById(R.id.videoView4); 

     SurfaceHolder holder = surfView.getHolder(); 
     holder.addCallback(this); 

     mMediaPlayer = new MediaPlayer(); 

     mMediaPlayerControl = new VideoControllerView.MediaPlayerControl() { 
      …… 
      } 


     mMediaPlayer.setOnPreparedListener(this); 


     mediaController.setOnSeekStartListener(new onSeekStartListener() { 

      @Override 
      public void onSeekStarted() { 

      } 
     }); 

     mediaController.setMediaPlayer(mMediaPlayerControl); 
     mediaController.setAnchorView((ViewGroup) findViewById(R.id.container4)); 
     mediaController.setEnabled(true); 
     mediaController.show(); 


    } 


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

     mMediaPlayer.setDisplay(holder); 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     mMediaPlayer.setDisplay(holder); 


     try { 

      mMediaPlayer.setDataSource(usedURL); 

      mMediaPlayer.prepareAsync(); 

     } catch (IllegalArgumentException e) { 

      e.printStackTrace(); 
     } catch (SecurityException e) { 

      e.printStackTrace(); 
     } catch (IllegalStateException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

    } 

    @Override 
    public void onPrepared(MediaPlayer mp) { 


     surfView.requestLayout(); 
     surfView.invalidate(); 

     mMediaPlayer.start(); 


    } 


    @Override 
    public void onSurfaceViewSizeChanged(int width, int height) { 


    } 

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

     mMediaPlayer.seekTo((int)PREV_PLAYER_POS); 


    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 

     mMediaPlayer.stop(); 
    } 

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


     PREV_PLAYER_POS = mMediaPlayer.getCurrentPosition(); 

     mMediaPlayer.pause(); 

    } 





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

     mMediaPlayer.release(); 
     mMediaPlayer = null; 
    } 

} 

С наилучшими пожеланиями

ответ

0

Начните видео в onResume,

@Override 
    protected void onResume() { 
     super.onResume(); 
    mMediaPlayer.start(); 
     mMediaPlayer.seekTo(length); 
} 

Надеется, что это будет работать ..

+0

Не работает. PS: Я не хочу запускать видео, когда пользователь возобновляет действие. Я хочу, чтобы игрок остался в состоянии паузы – user2498079

0

Поверхность SurfaceView может или не может быть уничтожена, когда вас принести что-то перед деятельностью. См. this section в документе графической архитектуры для обзора. Если он не будет уничтожен, то surfaceCreated() больше не будет вызываться, и ваше приложение никогда не вызовет mMediaPlayer.setDisplay(holder), чтобы подключить MediaPlayer к поверхности.

Я бы предположил, что если вы воспитываете «ретентатов», а затем поворачиваете устройство, все будет работать, когда вы вернетесь (потому что вращение устройства заставляет поверхность воссоздавать). Вы можете добавить некоторые записи в различные обратные вызовы, чтобы увидеть, когда они срабатывают.

Вам нужно будет иметь статическую переменную, которая отслеживает, была ли поверхность была разрушена (например, static bool haveSurface = false, установлены верно в surfaceCreated(), ложный в surfaceDestroyed(). Если это правда, в onCreate(), вызовите mMediaPlayer.setDisplay(holder) немедленно.

Grafika имеет некоторые примеры работы с нечетными вопросов жизненного цикла SurfaceView-VS-активность, хотя я не думаю, что любой из них вполне подходит ваш случай использования.

0

Почему вы это делаете?

surfView.requestLayout(); surfView.invalidate();

Это не имеет смысла. Вам не нужно отменять поверхность.

Смежные вопросы