1

Я хотел бы создать Activity с видеопроигрывателем для воспроизведения онлайн-потока с использованием класса MediaPlayer и SurfaceView для отображения. Я создаю MediaPlayer в отдельном сервисе, поэтому после поворота экрана плеер не нужно создавать снова и не нужно подключаться к потоку. Моя проблема в том, что я не знаю, как писать Activity, поэтому моя служба не будет запускаться каждый раз после поворота экрана.Android MediaPlayer для воспроизведения видеопотока при повороте экрана службы

Мой код ниже, в onStart() Я запускаю службу, но я не знаю, как ее изменить, чтобы она не начиналась каждый раз. Класс

public class VideoPlayerActivity extends Activity implements SurfaceHolder.Callback { 
    private String path; 
    private SurfaceHolder vidHolder; 
    private SurfaceView vidSurface; 
    private VideoService videoService; 
    private Intent playIntent; 
    private boolean videoBound = false; 

    private ServiceConnection musicConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      VideoService.VideoBinder binder = (VideoService.VideoBinder) service; 
      videoService = binder.getService(); 
      videoService.setUrl(path); 
      videoBound = true; 
      if (vidHolder != null && videoService.getMediaPlayer() != null) { 
       videoService.getMediaPlayer().setDisplay(vidHolder); 
       videoService.playVideo(); 
      } 
     } 
     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      videoBound = false; 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 
     path = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4"; //TODO tmp 
     playIntent = new Intent(this, VideoService.class); 
     bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
     startService(playIntent); 
     vidSurface = (SurfaceView) findViewById(R.id.surfView); 
     vidHolder = vidSurface.getHolder(); 
     vidHolder.addCallback(VideoPlayerActivity.this); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     if (videoService != null && videoService.getMediaPlayer() != null) { 
      videoService.getMediaPlayer().setDisplay(vidHolder); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 
     Log.d("ServiceConnection", "surfaceChanged " + i + " " + i1 + " " + i2); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     Log.d("ServiceConnection", "surfaceDestroyed"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unbindService(musicConnection); 
     stopService(playIntent); 
     videoService = null; 
    } 
} 

Услуги:

public class VideoService extends Service implements OnPreparedListener { 
    private MediaPlayer player; 
    private String path; 
    private final IBinder musicBind = new VideoBinder(); 

    @Override 
    public void onCreate() { 
     Log.d("VideoService", "onCreate"); 
     super.onCreate(); 
     player = new MediaPlayer(); 
     initMusicPlayer(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return musicBind; 
    } 

    @Override 
    public boolean onUnbind(Intent intent){ 
     player.stop(); 
     player.release(); 
     return false; 
    } 

    public void initMusicPlayer() { 
     player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setOnPreparedListener(this); 
    } 

    public void playVideo() { 
     try { 
      player.setDataSource(path); 
      player.prepareAsync(); 
     } catch (IOException e) {} 
    } 

    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     mediaPlayer.start(); 
    } 

    public void setUrl(String url) { 
     path = url; 
    } 

    public MediaPlayer getMediaPlayer() { 
     return player; 
    } 

    public class VideoBinder extends Binder { 
     public VideoService getService() { 
      return VideoService.this; 
     } 
    } 
} 
+0

В чем проблема при запуске службы несколько раз? – pskink

+0

@pskink Каждый раз, когда создается MediaPlayer и он должен подключаться к потоку (требуется несколько секунд) – user3626048

+1

вы создаете MediaPlayer в 'onCreate', этот метод вызывается только один раз, а не каждый раз, когда вызывается' startService', больше [здесь ] (https://developer.android.com/guide/components/services.html#Basics) – pskink

ответ

0

Вы можете либо проверить savedInstanceState будучи нуль только запустить службу, если активность свеже создано

if (savedInstanceState == null) { 
     startService... 
} 

или ручки поворота экрана самостоятельно, добавив

android:configChanges="orientation|keyboardHidden|screenSize" 

вашей деятельности в манифесте. Подобно этому onCreate больше не будет вызываться при вращении.