我开发的应用可以从YouTube播放视频,如果用户按下主页按钮,用户可以听到音频,然后他们可以再次看到视频。 因此,我使用Mediaplayer和setDisplay surfaceview来查看视频,但无法让播放器在家中按下时播放,我知道Service可以在后台执行长时间运行的操作,并且不提供用户界面。所以,我创建了持有媒体播放器在使用服务中的媒体播放器在背景中播放视频
public class VideoPlayerService extends Service implements MediaPlayer.OnPreparedListener {
private static final String TAG = "VideoPlayerService";
public MediaPlayer mPlayer;
public static int position;
private final IBinder mBinder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "service in onBind");
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
mPlayer = new MediaPlayer();
Log.d(TAG, "service created");
}
public class LocalBinder extends Binder {
public VideoPlayerService getService() {
return VideoPlayerService.this;
}
}
@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
return 1;
}
public IBinder onUnBind(final Intent arg0) {
return null;
}
}
服务并在其上我的活动结合来获得服务实例,并得到媒体播放器实例setDisplay
surfaceview它。但它看起来像,我可以setDisplay
到媒体播放器,因为我的活动留下onCreate()
acording这个 android-how-do-i-wait-until-a-service-is-actually-connected
但表面活性imediately之前创建的服务实例不回,我不能setDisplay
到媒体播放器显示视频,如何我能超越这个问题,这里是我的活动:
public class VideoPlayerActivity extends Activity implements SurfaceHolder.Callback, MediaController.MediaPlayerControl, GetStreamUrlTest.IPlayerListener, MediaPlayer.OnPreparedListener {
static final String TAG = "VideoPlayerActivity";
public MediaController mMediaController;
public SurfaceView surfaceView;
public SurfaceHolder holder;
public VideoItem mVideoItem;
public int position = 0;
private VideoPlayerService mVideoPlayerService;
private boolean mBounded;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
VideoPlayerService.LocalBinder localBinder = (VideoPlayerService.LocalBinder)
iBinder;
mVideoPlayerService = localBinder.getService();
mBounded = true;
Log.d(TAG, "Service connected");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e(TAG, "Service has unexpectedly disconnected");
mBounded = false;
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.videoplayer);
Log.d(TAG, "in Oncreate");
mMediaController = new MediaController(this);
mMediaController.setMediaPlayer(this);
mMediaController.setAnchorView(surfaceView);
Intent intent = getIntent();
mVideoItem = (VideoItem) intent.getParcelableExtra(ConstantFields.VIDEO_ITEM);
getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
holder = surfaceView.getHolder();
holder.setFixedSize(800, 480);
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
protected void onStart() {
super.onStart();
Intent serviceIntent = new Intent(this, VideoPlayerService.class);
bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!mMediaController.isShowing()){
mMediaController.show();
} else {
mMediaController.hide();
}
return false;
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void doPlayVideo(VideoItem videoItem){
Log.d(TAG,"in DO Play");
mVideoPlayerService.mPlayer.reset();
try {
mVideoPlayerService.mPlayer.setDataSource(this, Uri.parse(videoItem.getStreamUrl()));
mVideoPlayerService.mPlayer.prepareAsync();
mVideoPlayerService.mPlayer.setOnPreparedListener(this);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mVideoPlayerService.mPlayer.start();
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
mVideoPlayerService.mPlayer.setDisplay(surfaceHolder);
doPlay(mVideoItem)
Log.d(TAG, "In surface Created");
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
感谢您的提问,我正在使用google exoplayer做同样的事情。我应该问一下我的疑问吗? –