2014-05-18 114 views
2

我开发的应用可以从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) { 
} 
} 
+0

感谢您的提问,我正在使用google exoplayer做同样的事情。我应该问一下我的疑问吗? –

回答

2

我只是在surfaceCreated(SurfaceHolder surfaceHolder)存储surfaceHolder作为类的字段,然后用它的服务创建时。 对不起,一个愚蠢的问题,但我认为这段代码可以用于任何想用媒体播放器播放音频或视频的人

相关问题