安卓MediaPlayer在服务屏幕旋转中播放视频流



我想用视频播放器创建"活动",用MediaPlayer类和SurfaceView来显示在线流。我正在单独的服务中创建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;
        }
    }
}

如果活动是新创建的,您可以检查savedInstanceState是否为空,也可以仅启动服务

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

或通过添加自行处理屏幕旋转

android:configChanges="orientation|keyboardHidden|screenSize"

到清单中的活动。像这样,onCreate将不再在旋转时调用。

相关内容

  • 没有找到相关文章

最新更新