微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 蓝牙耳机控制视频快进快退

蓝牙耳机控制视频快进快退

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
蓝牙耳机按照google的passthrough_cmd_cb方式回调时,视频播放器需要通过RemoteControlCLIent更新状态给到BT,最终实现蓝牙耳机控制视频的快进快退
[SOLUTION]
Step1: 创建RemoteControlClient对象;
Step2: 借助OnPlaybackPositionUpdateListener来获取BT传过来快进快退后的newpos,并将视频seek到相应的位置;
如上两个步骤实现具体
code:alps/packages/apps/Gallery2/src/com/android/gallery3d/app/MoviePlayer.java
public MoviePlayer(View rootView, final MovieActivity movieActivity,
IMovieItem info,
Bundle savedInstance, boolean canReplay, String cookie) {
....
//added for fast rewind and forward start
//Step1: creat RemoteControlClient object
mAudioManager = (AudioManager)
mContext.getSystEMService(Context.AUDIO_SERVICE);
ComponentName rec = new ComponentName(mContext.getPackageName(),
MediaButtonIntentReceiver.class.getName());
mAudioManager.registerMediaButtonEventReceiver(rec);
Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
i.setComponent(rec);
PendingIntent pi = PendingIntent.getBroADCast(mContext /*context*/,
0 /*requestCode, ignored*/, i /*intent*/, 0 /*flags*/);
mRemoteControlClient = new RemoteControlClient(pi);
//Step2: override callback
int flags = RemoteControlClient.FLAG_KEY_MEDIA_POSITION_UPDATE;
mRemoteControlClient.setTransportControlFlags(flags);
mRemoteControlClient.setPlaybackPositionUpdateListener(new
OnPlaybackPositionUpdateListener() {
@Override
public void onPlaybackPositionUpdate(long newpos) {
long cur_pos = mVideoView.getCurrentPosition();
long duration = mVideoView.getDuration();
Log.i(TAG, "onPlaybackPositionUpdate newpos: " + newpos + ", cur_pos: " +
cur_pos + ", duration: " + duration);
if(newpos < 0){
newpos = 0; // play fROM begin
}else if(newpos > duration){
newpos = duration;
}
if(cur_pos - newpos > duration/8){
newpos = cur_pos - duration/8;
}else if(newpos - cur_pos > duration/8){
newpos = cur_pos + duration/8;
}
Log.i(TAG,"newpos: " + newpos);
mVideoView.seekTo((int)newpos);
mRemoteControlClient.setPlaybackState(
cur_pos: RemoteControlClient.PLAYSTATE_REWINDING, newpos, 1.0f);
}
});
//added for fast rewind and forward end
...
}
Step3: AP在开始做渲染的时候,将当前play/pause的状态传给BT
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
...
// / M: add log for performance auto test @{
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
Log.i(TAG,"MoviePlayer.onInfo rendering start setPlaybackState
PLAYSTATE_PLAYING");//added by mtk
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYIN
G,
mVideoView.getCurrentPosition(),1.0f);//added by mtk
...
}
...
}
Step4: AP做了seek动作后,要更新位置给BT;
@Override
public void onSeekEnd(int time, int start, int end) {
if (LOG) {
Log.v(TAG, "onSeekEnd(" + time + ") mDragging=" + mDragging);
}
mDragging = false;
// /M:No need to seek to the same position twice
if (mSeekMovePosition != time) {
// / @}
mVideoView.seekTo(time);
mRemoteControlClient.setPlaybackState(isPlaying() ?
RemoteControlClient.PLAYSTATE_PLAYING
: RemoteControlClient.PLAYSTATE_PAUSED, time, 1.0f);//added by MTK
}
...
}
Step5: AP做了play/pause切换后,要将状态更新给BT
public boolean onKeyDown(int keyCode, KeyEvent event) {
...
switch (keyCode) {
case KeyEvent.KEYCODE_HEADSETHOOK:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
if (mVideoView.isPlaying() && mVideoView.canPause()) {
pauseVideo();
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED
,
mVideoView.getCurrentPosition(), 1.0f); //added by MTK
} else {
playVideo();
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYIN
G,
mVideoView.getCurrentPosition(), 1.0f); //added by MTK
}
//set view disabled(play/pause asynchronous processing)
mController.setViewEnabled(false);
return true;
case KeyEvent.KEYCODE_MEDIA_PAUSE:
if (mVideoView.isPlaying() && mVideoView.canPause()) {
pauseVideo();
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED
,
mVideoView.getCurrentPosition(), 1.0f); //added by MTK
//set view disabled(play/pause asynchronous processing)
mController.setViewEnabled(false);
}
return true;
case KeyEvent.KEYCODE_MEDIA_PLAY:
if (!mVideoView.isPlaying()) {
playVideo();
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYIN
G,
mVideoView.getCurrentPosition(), 1.0f); //added by MTK
//set view disabled(play/pause asynchronous processing)
mController.setViewEnabled(false);
}
return true;
...
}
....
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top