首先,申请权限,音频视频的权限都是一样的
注意的是,音频视频都只要WRITE_EXTERNAL_STORAGE这个权限,Intnet权限是为了获取网络uri的视频而给的权限。
一开始oncreat里面的手动申请权限 音频视频都为这一个权限。
值得注意的是,seekbar这个内部类,需要重写三个方法,分别是
onProgressChanged(),onStartTrackingTouch(),onStopTrackingTouch()
三个方法。
android自带的视频控制器,是没有记录拖动播放的功能的,所以必须自己去定义。手机获取的音频视频时长都为毫秒,需要/1000才是秒。
以下代码就在手机SD卡目录中的一个音频,视频播放,如果联网,需要uri.parse()去解析,再去根据uri并联网执行(需要联网权限)。
最后,重写onDestroy()方法时,要记得释放资源
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
if (videoView != null) {
videoView.suspend();
}
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Bind(R.id.seek_view_bar)
SeekBar seekViewBar;
private MediaPlayer mediaPlayer = new MediaPlayer();
private boolean isChanging = false;
private boolean isStarting = false;
// private int currentPosition;//目前简单功能还不需要记录进度,所以用不到该int
private Timer timer;
@Bind(R.id.start_btn)
Button startBtn;
@Bind(R.id.pause_btn)
Button pauseBtn;
@Bind(R.id.cancel_btn)
Button cancelBtn;
@Bind(R.id.time_txt)
TextView timeTxt;
@Bind(R.id.seek_bar)
SeekBar seekBar;
// private VideoView videoView;//问题出在一直重复声明videoview导致错误。很傻逼.@Bind已经全部完成了的
@Bind(R.id.vedio_view)
VideoView videoView;
@Bind(R.id.start_video_btn)
Button startVideoBtn;
@Bind(R.id.pause_video_btn)
Button pauseVideoBtn;
@Bind(R.id.replay_video_btn)
Button replayVideoBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// videoView = (VideoView) this.findViewById(R.id.vedio_view); //错啊错
startBtn.setOnClickListener(this);
pauseBtn.setOnClickListener(this);
cancelBtn.setOnClickListener(this);
startVideoBtn.setOnClickListener(this);
pauseVideoBtn.setOnClickListener(this);
replayVideoBtn.setOnClickListener(this);
//手动申请权限,视频音频权限为同一个
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.
WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);//权限返回码为1
} else {
initAudio();
initVideo();
}
}
/**
* 打开mp4文件,文件名为movie.mp4
*/
private void initVideo() {
File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4");
//这是针对网络视频的加载uri。但是对网络视频有许多限制。
//网络uri视频,需要加入联网权限。切记,否则无法播放视频
// Uri uri = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
// videoView.setVideoURI(uri);
videoView.setVideoPath(file.getPath());
videoView.requestFocus();
videoView.setMediaController(new MediaController(this));//调出视频控制器,前后进什么的
}
/**
* 为固定的SD卡目录下music.mp3文件播放
*/
private void initAudio() {
try {
File file = new File(Environment.getExternalStorageDirectory(), "music.mp3");
mediaPlayer.setDataSource(file.getPath());//准备文件
mediaPlayer.prepare();//完成准备工作
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 依旧是申请权限
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initAudio();
} else {
Toast.makeText(this, "您禁止了权限,所以无法访问~", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.start_btn:
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
int time = mediaPlayer.getDuration();
//获得的时间长度除以1000才是秒数
int min = time / 1000 / 60;
int s = (time / 1000) % 60;
Toast.makeText(this, "" + min + "分钟" + s + "秒", Toast.LENGTH_SHORT).show();
timeTxt.setText("" + min + "分钟" + s + "秒");
//设置定时器,配合seekbar使用更新进度
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!isChanging) {
seekBar.setMax(mediaPlayer.getDuration());//设置进度条最大值
seekBar.setOnSeekBarChangeListener(new MySeekbar());//Myseekbar的类实例
seekBar.setProgress(mediaPlayer.getCurrentPosition());//seekbar设置进度
}
}
}, 0, 50);
}
break;
case R.id.pause_btn:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
break;
case R.id.cancel_btn:
if (mediaPlayer.isPlaying()) {
mediaPlayer.reset();
initAudio();
}
break;
case R.id.start_video_btn:
if (!videoView.isPlaying()) {
videoView.start();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!isStarting) {
seekViewBar.setMax(videoView.getDuration());
seekViewBar.setOnSeekBarChangeListener(new MyMySeekbar());
seekViewBar.setProgress(videoView.getCurrentPosition());
}
}
}, 0, 100);
/**
* 该段代码,动态设置全屏模式。
*/
/* LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
videoView.setLayoutParams(layoutParams);*/
}
break;
case R.id.pause_video_btn:
if (videoView.isPlaying()) {
videoView.pause();
}
break;
case R.id.replay_video_btn:
if (videoView.isPlaying()) {
videoView.resume();
}
break;
default:
break;
}
}
class MyMySeekbar implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
//这里面是写进度改变的代码
// int targettime = videoView.getDuration()*seekViewBar.getProgress()/100;
// videoView.seekTo(targettime);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isStarting = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
videoView.seekTo(seekViewBar.getProgress());
isStarting = false;
}
}
/**
* MySeekbar需要一个内部类,重写三个方法
*/
class MySeekbar implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
//滚动时暂停后台的定时器
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isChanging = true;
}
//滑动结束后,重新设定值
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
isChanging = false;
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
if (videoView != null) {
videoView.suspend();
}
}
}