实训报告书
实训名称: android平台的视频播放器
系(部): 信息工程系
专业班级: 计算机10-2
学生姓名: 张为为
学 号: 1043030147
指导教师: 张民
完成日期: 20##年11月7日
山东科技大学泰山科技学院
目 录
1实训目的........................................................................................ 1
2视频播放器的分析与设计...................................................................................... 1
3实训内容........................................................................................ 1
4时间安排........................................................................................ 2
5工作安排........................................................................................ 2
附录........................................................................................... 6
基于andriod平台视频播放器系统的设计与实现
1实训目的
《嵌入式应用开发技术》是计算机专业一门重要的专业技术实践课程。为了能够较好的完成实训任务,学生应具备嵌入式系统和软件开发的基础知识,实训的主要目的在于将理论与实际应用相结合,使用程序设计语言java,以及相关软件设计开发知识完成软件的设计开发任务。本实训课程将为整个专业的学习以及软件设计水平的提高打下良好的基础,提高学生项目分析、设计、编写、调试和测试的能力,并培养基本的、良好的团队合作能力。
2视频播放器系统的设计与实现
2.1系统功能描述
一个基于Android平台的视频播放器
基本要求:
(1)能够播放.avi,.mp4等文件
(2)能处理简单的异常,例如文件不存在等
(3)能正常启动,退出
(4)能够在手机上使用该系统
2.2 系统模块设计
主要功能:
功能介绍:根据分析需求,这个支持视频格式文件的播放功能,导入要播放的视频文件到指定文件夹下,播放时只可以选定文件夹的视频就可以。设计的软件支持快进,暂停,继续,复位重复播放等功能,视频播放软件工程文件主要包括src文件夹下,可以直接定位到sdcard中的文件进行播放。
2.3 数据库结构设计
数据库设计是信息资源管理模式的有效手段。对视频文件的存储,读取主要是通过SQLite。SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。 数据库设计是指:对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。
该播放器设计上分为两部分,一是播放及其过程的流程控制,一个是通过数据库对播放文件的存储,读取。
在播放及其过程的流程控制中主要重视文件在播放过程中的可能存在的状态,比如暂停,停止,列表中的上个视频等按键功能。
在数据库对播放文件的存储,读取中主要注重scard中的所有文件操作。在视频文件的播放,以及播放文件的存储读取时具有的交互作用。
系统主要分析:
3 主要代码清单
3.1播放控制功能的设计
在打开播放文件之后,点击画面的提示图标,分别有前进,暂停,播放等按键功能
数据库技术是信息资源管理最有效的手段。数据库设计是指:对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。
3.2主要程序清单
Src:MainActivity.java
package com.example.videoplayer;
import java.io.File;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";//
private EditText filenameText;
private String filename;
private int position;
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
filenameText = (EditText) this.findViewById(R.id.filename);//设置一个识别代码
mediaPlayer = new MediaPlayer();
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
surfaceView.getHolder().setFixedSize(176, 144);// 设置分辨率
surfaceView.getHolder()
//设置等待屏幕的渲染引擎将内容推送到用户面前,就是不缓冲直接显示视频
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//按钮功能能框
ButtonClickListener listener = new ButtonClickListener(); //按键侦听识别函数
ImageButton susButton = (ImageButton) this.findViewById(R.id.suspend);
ImageButton resetButton = (ImageButton) this.findViewById(R.id.reset);
ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop);
//设置按键识别函数接口
playButton.setOnClickListener(listener);
susButton.setOnClickListener(listener);
resetButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener);
}
//一下实现View.OnClickListene,实现它的播放
private final class ButtonClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(MainActivity.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.stop:
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, e.toString());
}
}
}
private void play() throws IOException { //检测异常并抛出相应的异常
File videoFile = new File(Environment.getExternalStorageDirectory(),
filename);
mediaPlayer.reset();// 重置为初始状态
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.setDataSource(videoFile.getAbsolutePath());
mediaPlayer.prepare();// 缓冲
mediaPlayer.start();// 播放
}
}
Gen下的R.JAVA代码
package com.example.videoplayer;
publicfinalclass R {
publicstaticfinalclass attr {
}
publicstaticfinalclass dimen {
/** Default screen margins, per the Android Design guidelines.
Customize dimensions originally defined in res/values/dimens.xml (such as
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
*/
publicstaticfinalint activity_horizontal_margin=0x7f040000;//水平宽度
publicstaticfinalint activity_vertical_margin=0x7f040001;//垂直高度
}
publicstaticfinalclass drawable {
publicstaticfinalint ic_launcher=0x7f020000;
publicstaticfinalint play=0x7f020001;//开始播放
publicstaticfinalint reset=0x7f020002;//重复播放
publicstaticfinalint stop=0x7f020003;
publicstaticfinalint suspend=0x7f020004;
}
publicstaticfinalclass id {
publicstaticfinalint action_settings=0x7f080007;
publicstaticfinalint ed=0x7f080001;
//对应activity程序中的文件名
publicstaticfinalint item1=0x7f080008;
publicstaticfinalint play=0x7f080002; //播放地址
publicstaticfinalint reset=0x7f080004; 重复播放
publicstaticfinalint stop=0x7f080005; 停止播放
publicstaticfinalint surfaceView=0x7f080006;
publicstaticfinalint suspend=0x7f080003;
publicstaticfinalint textview=0x7f080000;
//按键设置框变量
}
publicstaticfinalclass layout {
publicstaticfinalint main=0x7f030000;
}
publicstaticfinalclass menu {
publicstaticfinalint main=0x7f070000;
}
publicstaticfinalclass string {
publicstaticfinalint action_settings=0x7f050001;
publicstaticfinalint app_name=0x7f050000;
publicstaticfinalint filename=0x7f050002;
publicstaticfinalint sdcarderror=0x7f050003;
}
publicstaticfinalclass style {
publicstaticfinalint AppBaseTheme=0x7f060000;
publicstaticfinalint AppTheme=0x7f060001;
}
}
图大小设置后的结果
4程序运行与测试
4.1 软件环境
完整的软件环境是有JDK安装和androidSDK安装,在eclips环境下进行调试,Eclipse采用的技术是IBM公司开发的SWT,这是一种基于Java的组件,
类似Java本身提供的AWT和Swing窗口:不过IBM声称SWT比其他Java窗口组件更有效率。Eclipse的用户界面还使用了GUI中间层JFace,从而简化基于SWT的应用程序的构建。Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其他所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基于内核包括:图形API(SWT/JFace),Java开发环境插件(JDT),插件开发
Eclipse的插件机制是轻型软件组件化架构。在富客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java以外的其他语言。已有的分离的插件已经能够支持C/C++(CDT)、Perl、Ruby、Python、telnet和数据库开发。插件架构能够支持将任意的扩展加入到现有环境中,例如配置管理,而决不仅限支持各种语言。
JDK开发java程序能够很快理解程序中的代码之间的关系,有利于解决java面向对象的设计思想。对java语言熟练程度,Android软件开发都是java语言来实现的,而java又是类来组成来实现的。
4.2程序调试与分析
此次程序运行采用的模拟器是android3.1,并且分别导入mp3,mp4等文件进
试。一开始系统点击视频播放器的图标进入视频播放器界面,执行videoplayeractivity.java,就可以执行视频播放器的操作了:播放,暂停,快进,退出等。
调试过程中遇到的一些问题:
开始运行run as 时模拟器启动不起来。原因是ram没存分配过大,运行不起来所致。解决办法:把运行内存改小了。调试后进入模拟器,图片不动态显示,只有界面显示,后来也没有解决怎么回事,改了下程序最后自己好了。
在向sdcard中导入文件时不能使用中文路径,程序好像不识别。方法把路径名用英文代替就好了。
在改工程关闭以后再次打开后,工程不能用,以为环境不可以,纠结了好久,后来发现workplace下没有工程导入。可是导入的时候导入成功了,关闭,关闭环境之后不可以了。最后重新弄环境,改在windows下面运行,才解决。
4.3最终运行结果如下:
该播放器设计上分为两部分,一是播放及其过程的流程控制,一个是通过数据库对播放文件的存储,读取。
在播放及其过程的流程控制中主要重视文件在播放过程中的可能存在的状态,比如暂停,停止,列表中的上个视频等按键功能。
在数据库对播放文件的存储,读取中主要注重scard中的所有文件操作。在视频文件的播放,以及播放文件的存储读取时具有的交互作用。
该播放器设计上分为两部分,一是播放及其过程的流程控制,一个是通过数据库对播放文件的存储,读取。
在播放及其过程的流程控制中主要重视文件在播放过程中的可能存在的状态,比如暂停,停止,列表中的上个视频等按键功能。
在数据库对播放文件的存储,读取中主要注重scard中的所有文件操作。在视频文件的播放,以及播放文件的存储读取时具有的交互作用。
手机运行截图:
5实训总结
5.1环境总结:
首先对andriod环境有个比较全面熟悉的了解。Android所有布局都放在res/layout中,所有菜单功能都在menu中。此次课程设计中不仅了解到android的有关知识,课程设计要求,想好系统应包含哪些功能模块,否则一头雾水。开始不知道怎么弄,前两天都没有什么头绪,就是因为总体模块不了解,只有了解各个模块功能才可以。
5.2 调试过程中遇到的一些问题:
开始运行run as 时模拟器启动不起来。原因是ram没存分配过大,运行空间太小所致。解决办法:把运行内存改小了。
调试后进入模拟器,图片不动态显示,只有界面显示,后来也没有解决怎么回事,改了下程序最后自己好了。
在向sdcard中导入文件时不能使用中文路径,程序好像不识别。方法把路径名用英文代替就行了。
刚开始检测视频播放器时出现黑屏,上网上查说,android模拟器的事,andriod在2.0以后就有这个dbug。
调试时出现could not find videoplayer.apk
用点击菜单栏中的project>properties>java build path 选择libraries,点击按android3.7就行,可能版本太高不支持。
具备快速上网查资料的能力,对于新知识的接触要把所学知识活用,结合网上实例把自己知识用到实践中去。
如果一个类中没有够造方法,调用构造方法时系统自动给构造一个默认的无参的够造方法
当对象调用的构造方法已经有了就不会再自动构造必须与已有的参数保持一致。
最好先写一个无参构造方法普遍,public 类名{}。通过this引用调用类重载构造方法;根据参数类型和个数来判断哪个构造方法;
5.3 还需要改进之处:
1播放器的播放界面比较简单,各个功能模块还要进一步完善。
2 播放器只支持。MP4,MP3格式,还应支持多媒体的其他格式
3 只能播放一个视频文件,且播放时不能显示不放歌曲的歌词,不能对多个文件上下选择进行播放,这是较大缺陷,以后再此基础上进一步扩充和改进。