实习报告
实习性质:
学 院: 信息工程学院
班 级:
学生姓名:
学 号:
指导老师:
实习时间:
一、 实训目的和任务
1、 实训任务
android视频播放器系统的设计与实现
2、实训目的
本学期我们学习了JAVA课程和Android应用程序开发课程。而Android应用程序是利用Java语言开发的,本次实训能够对我们所学的Java语言和Android应用程序开发的一次综合实践,使我们能够更好的掌握Java语言在实际开发中的应用,同时也为了使我们能够更好的掌握和学习Android应用程序开发,对所学的知识进一步牢固。培养运用所学知识解决实际课程的能力,培养开发Android应用程序的思想和方法。同时在实训过程中也能不断学习新的知识。
二、 实训设计思路
1、 工程图
图2-1 工程图
2、 流程图
1)输入文件模块:在该模块中采用EditText控件来实现。
2)播放视频模块:该模块是用MediaPlayer类通过surfaceView来实现。
3)暂停播放模块:该模块是用MediaPlayer.push()方法来实现。
4)重播模块:该模块通过MediaPlayer.reset()方法来实现。
5)停止播放模块:该模块通过MediaPlayer.stop()方法实现。
6)快进模块:该模块通过MediaPlayer.seekTo()方法来实现。
7)后退模块:该模块通过MediaPlayer.seekTo()方法来实现。
8)退出模块:该模块通过调用finish()方法来实现,并释放资源。
图2-2 流程图
3、总体设计思路
该系统是一个能够在Android平台下运行的视频播放器。能够实现一下功能:
1)播放功能:
能够实现mp4、avi格式文件的播放。
2)暂停功能:
点击暂停按钮时能够暂停播放视频,再次点击暂停按钮时能够继续播放。
3)重播功能:
点击重播按钮时能够从头开始播放视频。
4)停止功能:
点击停止按钮时能够停止播放视频,再点击播放按钮时能够从头开始播放。
5)快进功能:
点击快进按钮时能够向前跳跃5秒播放。
6)后退功能:
点击回退按钮时能够向后跳跃5秒播放。
7)显示进度条:
能够显示文件播放进度。
拖动进度条能够实现视频快进、快退功能。
8)退出功能:
点击退出按钮时能够正常退出程序。
三、具体代码及实现
3.1 main.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/filename"
/>
<EditText
android:id="@+id/filename"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="yueshen.mp4"
/>
该部分是在主界面上放置一个EditText看控件,在本程序中用于接收输入的文件名。
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="fill_parent"
android:layout_height="300dp"
/>
SurfaceView控件是用于播放视频的控件
<SeekBar
android:id="@+id/move"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
进度条控件
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/play"
android:layout_weight="1"
/>播放按钮
<ImageButton
android:id="@+id/suspend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/suspend"
android:layout_weight="1"
/>暂停按钮
<ImageButton
android:id="@+id/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/reset"
android:layout_weight="1"
/>复位按钮
<ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop"
android:layout_weight="1"
/> 停止按钮
<ImageButton
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/back"
android:layout_weight="1"
/> 后退按钮
<ImageButton
android:id="@+id/quick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/quick"
android:layout_weight="1"
/> 快进按钮
<ImageButton
android:id="@+id/exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/exit"
android:layout_weight="1"
/>退出按钮
</LinearLayout>
</LinearLayout>
3.2 Activity_main.java文件
1、seekbar拖动控件监听器
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progcess, boolean fromUser) {
// TODO Auto-generated method stub
int process = seekBar.getProgress();
int max = seekBar.getMax();
if (mediaPlayer != null) {
mediaPlayer.seekTo(mediaPlayer.getDuration() * process / max);
}
}
});
}
2、播放、停止、暂停、重播、快进、后退、退出按钮监听器
private final class ButtonClickListener implements View.OnClickListener
{
@Override
public void onClick(View v) {
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
Toast.makeText(ZhaoActivity.this, R.string.sdcarderror, 1).show();
return;
}
filename=filenameText.getText().toString();
try {
switch(v.getId())
{
case R.id.play:
play();
break;
case R.id.suspend:
if(mediaPlayer.isPlaying())
{
mediaPlayer.pause();
}else{
mediaPlayer.start();
}
break;
case R.id.reset:
if(mediaPlayer.isPlaying())
{
mediaPlayer.seekTo(0);
}else{
play();
}
break;
case R.id.quick:
if(mediaPlayer.isPlaying())
{
int i=mediaPlayer.getCurrentPosition()+5000;
mediaPlayer.seekTo(i);
}
break;
case R.id.back:
if(mediaPlayer.isPlaying())
{
int i=mediaPlayer.getCurrentPosition()-5000;
mediaPlayer.seekTo(i);
}
break;
case R.id.stop:
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
break;
case R.id.exit:
mediaPlayer.release();//释放资源
finish();
break;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, e.toString());
}
}
}
3、播放功能方法
private void play() throws IOException {
File videoFile = new File(Environment.getExternalStorageDirectory(),filename);
mediaPlayer.reset();//重置为初始状态
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDisplay(surfaceView.getHolder());
if(!videoFile.exists())
{
Toast.makeText(ZhaoActivity.this, R.string.fileerror, 1).show();
return;
}
mediaPlayer.setDataSource(videoFile.getAbsolutePath());
mediaPlayer.prepare();//缓冲
mediaPlayer.start();//播放
}
}
4、结果截图
4.1 在模拟器中运行结果
图4.1.1 文件不存在时报错信息
图4.1.2文件播放成功
4.2 在手机中运行结果
图4.2.1 程序安装成功
图4.2.2 要播放的视频不存在
图4.2.3 播放成功
四、实训总结
一周的《android应用程序开发实训》已经结束了,同时也使我们对我们所学的Java和android应用程序开发的知识有了更深的认识和理解,同时也锻炼了我们把所学的知识运用到实际开发中的能力,在这个过程中也使我深深感受到了自己所掌握的知识是远远不够的。
在刚开始的时候我并没有详细的做一个模块实际图,只是把想当然的几个功能加了进来,只是简单想实现播放器的播放、重播、暂停、停止功能,而忘了考虑快进、后退和进度条的问题。现将在整个过程中遇到的问题总结如下:
1、 主界面设计问题
在设计主界面的之前我参考了一些常用的android视频播放的主界面,只设置了播放、停止、暂停、重播、退出的按钮,然后再老师的指导下又加进了快进和后退按钮,在最后程序成型之后又发现没有显示播放进度的按钮。在添加上播放、停止、暂停、重播、退出的ImageButton之后,在添加播放界面时又遇到了问题不知道用什么控件去实现播放功能,后来通过学习达内的教学视频采用了surfaceview控件。而播放进度条通过网上查资料决定采用SeekBar控件来实现。
2、 视频播放器程序设计问题
在设计完主界面之后通过学习达内的教学视频采用MediaPlayer类来控制播放,然而在写完程序之后发现没有退出功能,在添加了退出功能之后,程序能够退出,但新的问题出现了,程序退出之后但声音还在继续播放,这是由于资源没有被释放的原因,后添加了mediaPlayer.release()方法解决了此问题
3、 进度条拖动问题
在添加了SeekBar之后虽然能拖动但并不能实现视频文件的快进。在查找资料之后,发现时由于SeekBar监听器方法出了问题。经修改之后问题得以解决。
4、 程序改善
虽然程序已经完成,但功能好不够完善,首先进度条不能自动更新显示动态,只能实现拖动快进、后退的功能。没有添加音量控制,不能实现文件扫描,只能手动输入文件。这些问题我会在以后的学习中去解决。
实训已经结束了,在整个过程中是我感触最深的是自己掌握的知识在实际应用开发中,还远远不够,虽然学习了达内的视频,但最初并没有真正理解代码的含义,只知其然而不知其所以然。整个过程我最大的收获就是对MediaPlayer类有了更深的认识。在今后的学习过程中我会加倍努力积累知识。