这几天在做一个蓝牙设备控制手机app里面的视频人体模型动,想的是用蓝牙传过来的数据然后去指定视频要播放哪一个时间点,于是就搜了一点关于怎么控制播放视频的某一时间端(的视频)当然这个方案可能最后不会用,但是这个知识点还是有必要记录的。
先看一下加载视频并控制的类的相关代码(代码可能有点乱)
package com.example.getbitmap;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.VideoView;
import com.example.bluetoothUtil.BluetoothClientService;
import com.example.bluetoothUtil.BluetoothTools;
import com.example.bluetoothUtil.TransmitBean;
/**
*
*/
public class ActionVideoStartActivity extends Activity {
private ImageView changeState;//改变视频播放还是暂停状态切换
private VideoView videoView;
private View layout;
private SeekBar skb_audio;//一个进度条,此处用不到
private Timer mTimer;
private TimerTask mTimerTask;
private int CurrentPosition;// 当前播放时间
private List<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();
HashMap<Object, Object> map = new HashMap<Object, Object>();//一个标记里面存放的是,该activity要加载的xml文件和要加载的视频
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 根据集合得到要加载的XML文件
setContentView(((View) chooseXmlAndSourceFile().get("xmlName")));
// 通过findViewById找到资源
changeState = (ImageView) layout.findViewById(R.id.changeState);
// 获取界面上VideoView组件
videoView = (VideoView) layout.findViewById(R.id.ble_surfaceview);
// 根据集合得到要加载的视频文件
LoadingVideo(((Integer) chooseXmlAndSourceFile().get("SourceFile")),
2777, 4000);
// 增加播放音乐按钮的事件
changeState.setOnClickListener(new ImageView.OnClickListener() {
@Override
public void onClick(View arg0) {
changeState();
}
});
videoView
.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// @Override
public void onCompletion(MediaPlayer arg0) {
try {
videoView.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
// videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
// @Override
// public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
// try {
//
// videoView.start();
// } catch (Exception e) {
// e.printStackTrace();
// }
// return false;
// }
// });
//开始搜索
Intent startSearchIntent = new Intent(BluetoothTools.ACTION_START_DISCOVERY);
sendBroadcast(startSearchIntent);
}
// 切换动画的状态
private boolean isStart = false;
public void changeState() {
if (isStart) {
isStart = false;
Drawable play_green_button = ((Context) (ActionVideoStartActivity.this))
.getResources().getDrawable(R.drawable.pause_green_button);
changeState.setImageDrawable(play_green_button);
// mGLSurfaceView.control(true);
videoView.start();
} else {
isStart = true;
Drawable pause_green_button = ((Context) (ActionVideoStartActivity.this))
.getResources().getDrawable(R.drawable.play_green_button);
changeState.setImageDrawable(pause_green_button);
// mGLSurfaceView.control(false);
videoView.pause();
}
}
// ----------定时器记录播放进度---------//
/** 加载视频 参数是播放的视频文件,开始时间,结束时间 */
public void LoadingVideo(int SourceFile, int startTime, final int endTime) {
String uri = "android.resource://" + getPackageName() + "/"
+ SourceFile;
videoView.setVideoURI(Uri.parse(uri));
videoView.seekTo(startTime);// 视频一开始就调到要指定的时间点处(毫秒)
videoView.start();// 然后开始播放
// int CurrentPosition = videoView.getCurrentPosition();//得到当前播放的视频时间点
// 声明一个时间计时器
mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
if (videoView.isPlaying()) {
CurrentPosition = videoView.getCurrentPosition();//当视频播放的时间点和指定结束点相同时暂停视频
if (CurrentPosition == endTime) {
videoView.pause();
}
}
}
};
/**
* schedule的意思(时间表、进度表)参数的意思是()
* 第一个参数"new MyTask(event.getServletContext())": 是 TimerTask 类,在包:import
* java.util.TimerTask .使用者要继承该类,并实现 public void run() 方法,因为 TimerTask
* 类实现了 Runnable 接口。
*
* 第二个参数"0"的意思是:(0就表示无延迟) 当你调用该方法后,该方法必然会调用 TimerTask 类 TimerTask 类 中的
* run() 方法,这个参数就是这两者之间的差值,转换成汉语的意思就是说,用户调用 schedule()
* 方法后,要等待这么长的时间才可以第一次执行 run() 方法。
*
* 第三个参数"60*60*1000"的意思就是: (单位是毫秒60*60*1000为一小时) (单位是毫秒3*60*1000为三分钟)
* 第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法
*
*
* */
mTimer.schedule(mTimerTask, 0, 10);//每10毫秒执行一次run方法
}
@Override
protected void onResume() {
super.onResume();
Drawable play_green_button = ((Context) (ActionVideoStartActivity.this))
.getResources().getDrawable(R.drawable.play_green_button);
changeState.setImageDrawable(play_green_button);
isStart = true;
}
/** 根据跳转传来的值进行判断要加载的XML文件以及视频文件 */
public HashMap<Object, Object> chooseXmlAndSourceFile() {
//这个地方是前面那个activity传过来的一个值,自己可以去掉直接选择要调用哪个xml文件
Intent intent = getIntent();
String actionName = intent.getStringExtra("actionName");
if (actionName.equals("cbct")) {// 床边垂腿
LayoutInflater inflater = (LayoutInflater) ActionVideoStartActivity.this
.getSystemService(LAYOUT_INFLATER_SERVICE);
layout = inflater.inflate(R.layout.activity_cbct, null);
map.put("xmlName", layout);
map.put("SourceFile", R.raw.cbct);
}
return map;
}
}