课程实习
评语:
目录
一、课程设计目的......................................................... 1
二、系统开发环境和工具................................................... 2
三、系统需求分析......................................................... 2
3.1 客户要求......................................................... 2
3.2 需求分析......................................................... 3
3.2.1 功能性需求.................................................. 3
3.2.2 非功能性需求................................................ 4
四、系统概要设计......................................................... 5
4.1 系统架构图....................................................... 5
4.2 系统部署图....................................................... 5
五、系统详细设计......................................................... 6
六、功能测试............................................................. 9
6.1 主界面........................................................... 9
6.2 拍照功能......................................................... 9
6.3 查看照片........................................................ 10
6.4 录音............................................................ 10
6.5 录像............................................................ 11
七、 代码分析........................................................... 12
7.1 主界面代码...................................................... 13
7.2 录像功能代码.................................................... 15
7.3 拍照功能代码.................................................... 17
7.4 录音功能代码.................................................... 21
八、 系统测试出现的问题和解决的方案..................................... 27
九、系统评价............................................................ 28
十、心得体会............................................................ 28
广铁集团乘务通软件系统开发
——拍照录像录音模块
一、课程设计目的
1、通过本次的开发,让我们回忆这几天老师讲述的android知识,加深对android基础知识的理解。
2、学以致用,根据开发的需求,灵活的运用相关的android知识,提高我们的自我创新和灵活设计的能力。
3、通过实际项目模块的练习,提高我们对实际项目要求的理解和对整个项目开发流程的体会。
4、通过实际项目的编写,一句句的敲代码,提高我们发现错误和解决错误的能力。
5、此次实训项目我们是以小组形式进行的,通过不同小组之间的分工合作共同完成一个模块,不但很好的发挥了每个人的优势,而且提高了我们大家之间相互合作的能力。
二、系统开发环境和工具
开发环境:windows,android
开发工具:eclipse,android手机,photoshop,visio等
运行环境:android2.3以上
三、系统需求分析
3.1 客户要求
拍照、录音、录像。存储到SD卡,并可以选择上传。
1)手动选择上传到服务器,对应每个用户的目录(目录名为当前日期)
2)录像/图片信息记录到数据库,后台可以查阅(只读)。
3)本地pad用户可以查看/删除自己的录像/图片等信息
3.2 需求分析
3.2.1 功能性需求
拍照:
① 开始拍照:用户进入应用后,点击拍照按钮后,应用可以进入拍照界面,然后用户可以自定义的进行拍照操作,拍完照后即将拍好的照片保存在手机的SD卡中。
② 浏览照片:用户进入应用后,点击浏览按钮后,应用将调用系统的图库功能,通过系统的图库功能即可查看本应用刚刚拍的照片。查看图片,可以对图片进行旋转,放大等操作。
③ 上传照片:用户进入应用后,点击上传按钮后,应用将通过网络与服务器相连,把自己想上传到服务器的照片上传到服务器的相应位置,然后将照片在服务的具体信息保存在数据库中。
④ 删除照片:用户通过系统的图库查看照片,在查看照片的过程中可以利用图库的功能对图片进行删除相应的照片。
录音:
① 开始录音:用户进入应用后,点击录音按钮后,自定义的录音功能将进行录音,点击停止录音后,相应的录音文件将保存在手机的SD卡中。然后在当前页面下面的列表中可以显示刚刚的录音文件。
② 播放录音:用户通过点击下面列表中的录音文件,可以弹出播放录音文件的文件列表,点击对话框中的播放按钮可以对录音文件进行播放。点击停止播放可以停止音乐的播放。
③ 上传录音:用户进入应用后,点击上传按钮后,应用将通过网络与服务器相连,把自己想上传到服务器的录音文件上传到服务器的相应位置,然后将照片在服务的具体信息保存在数据库中。
④ 删除录音:通过点击录音按钮可以弹出显示所有录音文件的对话框,在对话框中可以选择需要删除的录音文件,点击确定就可以从本地的SD卡中删除录音文件。
录像:
① 开始录像:用户进入应用后,点击录像按钮后,应用可以进入录像界面,然后用户可以自定义的进行录像操作,录完后即将拍好的照片保存在手机的SD卡中。
② 浏览录像:用户点击浏览按钮后,将显示所有录像的文件列表,然后点击文件即可播放录像。
③ 上传录像:用户进入应用后,点击上传按钮后,应用将通过网络与服务器相连,把自己想上传到服务器的录像上传到服务器的相应位置,然后将录像在服务的具体信息保存在数据库中。
④ 删除录像:点击相应录像列表中的录像文件,然后弹出的对话框中点击删除,确定后即可删除录像文件。
3.2.2 非功能性需求
① 客户端界面设计美观大方,给人良好的审美效果。
② 系统稳定运行不出错。
四、系统概要设计
4.1 系统架构图
4.2 系统部署图
五、系统详细设计
Activity模块
MainActivity模块 主界面
CameraResourceActivity 照相界面
ReCordSourceActivity 录音界面
ReCordAudioActivity 录像界面
ReCordAudioResourceActivity 录像资源管理界面
AudioReadViewActivity 录像播放界面
AboutActivity 关于界面
拍照:
1、调用系统照相功能
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
2、初始化,读取SD卡中的相片文件
initReadImage();
3、对相片进行图库浏览
startScan();
4、删除相片
deleteImage(imageName);
录音:
1、开始录音
record();
通过 MediaRecorder创建录音对象来开启自定义的录音功能
mediaRecorder = new MediaRecorder(); // 判断是都为空 如果为空new 一个对象
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置输入源为麦克风
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频的编码
显示录音状态
showRecordDialog();
2、录音成功,保存到SD卡并且同步显示在table列表中
showRecordList();
首先将文件写入到SD卡中,然后再从SD卡中读出录音文件,通过tablelayout的方式将录音文件显示出来。
3、播放、停止播放录音
通过点击tRow,弹出对话框,或者选取对象的录音名称,然后通过MediaPlayer创建出对对象mplayer
startPlaying(String singname);
mPlayer.start();//开始播放录音
4、删除录音
通过弹对话框的方式来显示录音文件列表,然后点击单选按钮来确定删除的文件。
showRadmeioDialog(ArrayList<String> filena)
录像:
1、开始录像并保存录像
通过MediaRecorder类来创建对象mediaRecorder,通过mediaRecorder来定义自定义的录音功能。
//实现预览效果 mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface() mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设计camera相机 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置录像视频的输出格式:THRE_GPP、MPGE-4、RAW——AMR、
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置视频、音频文件的编码:AAC/AMR_NB/AMR_MB/Default mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//设置视频录制的分辨率。必须放在编码和格式的后面,否则报错
mediaRecorder.setVideoSize(176, 144);
//设置录制的视频帧率,必须放在设置编码和格式的后面,否则报错
mediaRecorder.setVideoFrameRate(15);
mediaRecorder.start();
mediaRecorder.stop();
将录制的录像输出到相应SD卡中。
try{
File fileDir=new File(mRecordVedioPath+"/myAudio");
fileDir.mkdirs();
mRecordVedioFile=new File(fileDir,AndroidUtils.getNowDate()+".mp4");
}catch(Exception e){
e.printStackTrace();
}
2、播放录像
根据列表中选中的录像文件,调用系统的播放录像功能
Intent it = new Intent(Intent.ACTION_VIEW);
3、管理录像
点击录音列表中的录音文件,然后根据弹出的对话框,对录音文件进行删除等操作。
六、功能测试
6.1 主界面
6.2 拍照功能
6.3 查看照片
6.4 录音
6.5 录像
七、代码分析
7.1 主界面代码
public class MainActivity extends Activity implements OnClickListener, MediaScannerConnectionClient{
private Button btnCam,btnRecordVedio,btnRecordAudio,btnAbout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnCam=(Button) findViewById(R.id.btnCam);
btnRecordVedio=(Button) findViewById(R.id.btnRecordVedio);
btnRecordAudio=(Button) findViewById(R.id.btnRecoredAudio);
btnAbout=(Button) findViewById(R.id.btnAbout);
btnCam.setOnClickListener(this);
btnRecordAudio.setOnClickListener(this);
btnRecordVedio.setOnClickListener(this);
btnAbout.setOnClickListener(this);
}
public String[] allFiles;
private String SCAN_PATH ;
private static final String FILE_TYPE="image/*";
private MediaScannerConnection conn;
@Override
public void onClick(View v) {
Intent intent=null;
switch(v.getId()){
case R.id.btnCam:
intent=new Intent(this, CameraResourceActivity.class);
break;
case R.id.btnRecoredAudio:
intent=new Intent(this, ReCoredAudioResourceActivity.class);
break;
case R.id.btnRecordVedio:
intent=new Intent(this, ReCoredSourceActivity.class);
break;
case R.id.btnAbout:
intent=new Intent(this, AboutActivity.class);
break;
}
startActivity(intent);
}
public void initReadImage(){
File folder = new File("/sdcard"+ConstantInfo.PATH_IMAGE);
allFiles = folder.list();
for(int i=0;i<allFiles.length;i++)
{
Log.i("Other", allFiles[i]+allFiles.length);
} SCAN_PATH=Environment.getExternalStorageDirectory().toString()+ConstantInfo.PATH_IMAGE+allFiles[allFiles.length-1];
System.out.println(" SCAN_PATH " +SCAN_PATH);
Log.i("Other", "Scan Path " + SCAN_PATH);
}
private void startScan() {
Log.i("Other","success"+conn);
if(conn!=null) {
conn.disconnect();
}
conn = new MediaScannerConnection(this,this);
conn.connect();
}
@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub
Log.i("Other","success"+conn);
conn.scanFile(SCAN_PATH, FILE_TYPE);
}
@Override
public void onScanCompleted(String arg0, Uri uri) {
try {
Log.i("Other",uri + "success"+conn);
Log.i("Other","URI " + uri);
if (uri != null)
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
}
} finally {
conn.disconnect();
conn = null;
}
}
}
7.2 录像功能代码
public class ReCoredAudioResourceActivity extends Activity implements OnClickListener,SurfaceHolder.Callback{
private Button btnRecordAudio,btnLook,btnUpload,btnDelete;
private ImageView myImageView;
private Button btnRecordAudioStart,btnRecordAudioStop,btnRecordAudioReturn;
private SurfaceView mSurfaceView;//显示视频的控件
private MediaRecorder mediaRecorder;//录制视频的类
private SurfaceHolder mSurfaceHolder;
private File mRecordVedioPath;//录制视频文件的路径
private File mRecordVedioFile;//录制视频文件
private TextView tx1,tx2,tx3,tx4,tx5;
private int hour=0;
private int minute=0;
private int second=0;
private boolean bool;
/*定时器设置,实现计时*/
private Handler handler = new Handler();
private Runnable task = new Runnable(){
public void run() {
Log.i("Other", "开始录制66");
if(bool){
handler.postDelayed(this, 1000);
second++;
if(second<60){
tx5.setText(format(second));
}else if(second<3600){
minute=second/60;
second=second%60;
tx3.setText(format(minute));
tx5.setText(format(second));
}else{
hour=second/3600;
minute=(second%3600)/60;
second=(second%3600)%60;
tx1.setText(format(hour));
tx3.setText(format(minute));
tx5.setText(format(second));
}
}
}
};
//格式化时间
private String format(int i){
String s=i+"";
if(s.length()==1){
s="0"+s;
}
return s;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.vedio_main_resource);
tx1=(TextView) this.findViewById(R.id.recordVedio_tx1);
tx2=(TextView) this.findViewById(R.id.recordVedio_tx2);
tx3=(TextView) this.findViewById(R.id.recordVedio_tx3);
tx4=(TextView) this.findViewById(R.id.recordVedio_tx4);
tx5=(TextView) this.findViewById(R.id.recordVedio_tx5);
btnRecordAudio=(Button) this.findViewById(R.id.btnRecordAudio);
btnLook=(Button) this.findViewById(R.id.btnLook);
btnUpload=(Button) this.findViewById(R.id.btnUpload);
btnDelete=(Button) this.findViewById(R.id.btnDelete);
btnRecordAudioStart=(Button) this.findViewById(R.id.btnRecordAudioStart);
btnRecordAudioStop=(Button) this.findViewById(R.id.btnRecordAudioStop);
btnRecordAudioReturn=(Button) this.findViewById(R.id.btnRecordAudioReturn);
mSurfaceView=(SurfaceView) this.findViewById(R.id.recordVedio);
tx1.setVisibility(View.GONE);
tx2.setVisibility(View.GONE);
tx3.setVisibility(View.GONE);
tx4.setVisibility(View.GONE);
tx5.setVisibility(View.GONE);
//检查是否存在sdcard if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
mRecordVedioPath=Environment.getExternalStorageDirectory();
}else{
Toast.makeText(this, "没有sdcard", Toast.LENGTH_SHORT).show();
}
SurfaceHolder holder=mSurfaceView.getHolder();
holder.addCallback(ReCoredAudioResourceActivity.this);//holder加入回调接口
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置显示器类型
btnRecordAudioStart.setEnabled(true);
btnRecordAudioStop.setEnabled(true);
btnRecordAudio.setOnClickListener(this);
btnLook.setOnClickListener(this);
btnUpload.setOnClickListener(this);
btnDelete.setOnClickListener(this);
btnRecordAudioStart.setOnClickListener(this);
btnRecordAudioStop.setOnClickListener(this);
btnRecordAudioReturn.setOnClickListener(this);
}
7.3 拍照功能代码
public class CameraResourceActivity extends Activity implements OnClickListener,MediaScannerConnectionClient{
private Button btnCamera,btnLook,btnUpload,btnDelete;
private ImageView myImageView;
private String imageName=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_main_resource);
btnCamera=(Button) this.findViewById(R.id.btnCamera);
btnLook=(Button) this.findViewById(R.id.btnLook);
btnUpload=(Button) this.findViewById(R.id.btnUpload);
btnDelete=(Button) this.findViewById(R.id.btnDelete);
btnCamera.setOnClickListener(this);
btnLook.setOnClickListener(this);
btnUpload.setOnClickListener(this);
btnDelete.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btnCamera:
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
break;
case R.id.btnLook:
initReadImage();
startScan();
//look();
break;
case R.id.btnDelete:
deleteImage(imageName);
break;
}
}
public void deleteImage(final String filename){
if(filename==null){
return;
}
LayoutInflater factory = LayoutInflater.from(this);
// View view=factory.inflate(R.layout.audio_dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("是否删除");
builder.setIcon(android.R.drawable.ic_delete);
builder.setPositiveButton("删除", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
File file = new File("/sdcard" + ConstantInfo.PATH_IMAGE
+ filename+".jpg");
file.delete();
myImageView.setImageBitmap(null);
Toast.makeText(CameraResourceActivity.this, "已经删除", 1).show();
}
});
builder.setNegativeButton("返回", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Toast.makeText(CameraResourceActivity.this, "返回", 1).show();
}
});
builder.create().show();
}
public String[] allFiles;
private String SCAN_PATH ;
private static final String FILE_TYPE="image/*";
private MediaScannerConnection conn;
public void initReadImage(){
File folder = new File("/sdcard"+ConstantInfo.PATH_IMAGE);
allFiles = folder.list();
if(allFiles==null){
return;
}
for(int i=0;i<allFiles.length;i++)
{
Log.i("Other", allFiles[i]+allFiles.length);
} SCAN_PATH=Environment.getExternalStorageDirectory().toString()+ConstantInfo.PATH_IMAGE+allFiles[allFiles.length-1];
System.out.println(" SCAN_PATH " +SCAN_PATH);
Log.i("Other", "Scan Path " + SCAN_PATH);
}
private void startScan() {
Log.i("Other111","success111"+conn);
if(conn!=null) {
conn.disconnect();
}
conn = new MediaScannerConnection(this,this);
conn.connect();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==Activity.RESULT_OK){
String sdStatus=Environment.getExternalStorageState();
if(!sdStatus.equals(Environment.MEDIA_MOUNTED)){//检测sdcard是否有可用
return;
}
Bundle bundle=data.getExtras();
Bitmap bitmap=(Bitmap) bundle.get("data");//获取相机返回的数据,并转换为Bitmap图片格式
FileOutputStream b=null;
File file=new File("/sdcard/myImage");
file.mkdirs();//创建文件夹
//创建图片名
imageName= AndroidUtils.getNowDate();
String fileName="/sdcard/myImage/"+imageName+".jpg" ;
try {
b = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
}
}
myImageView=(ImageView) this.findViewById(R.id.myImage);
// 将图片显示在ImageView里
myImageView.setImageBitmap(bitmap);
}
}
@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub
Log.i("Other","success222"+conn);
conn.scanFile(SCAN_PATH, FILE_TYPE);
}
@Override
public void onScanCompleted(String arg, Uri uri) {
// TODO Auto-generated method stub
try {
Log.i("Other",uri + "success333"+conn);
Log.i("Other","URI " + uri);
if (uri != null)
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
}
} finally {
conn.disconnect();
conn = null;
}
}
}
7.4 录音功能代码
public class ReCoredSourceActivity extends Activity {
private MediaPlayer mPlayer = null; //媒体播放对象
public String path = ""; //临时存储路劲
private LinearLayout mlinearLayout; //线性布局
private TableLayout userlistTL; //表格布局
private MediaRecorder mediaRecorder = null; //录音媒体
private Button start_re; //开始录音按钮
private Button exit; //退出录影按钮
private Button delete; //删除录音按钮
private AlertDialog dialog =null; //弹出的对话框对象
private boolean isruning = false; // 定义一个布尔类型的变量来监控是否正在录音
private String filenameString;
ArrayList<String> filename = new ArrayList<String>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recored_main_resource);
//对布局文件进行初始化
start_re = (Button) findViewById(R.id.start_re);
exit = (Button) findViewById(R.id.btnexit);
delete=(Button)findViewById(R.id.btnDelete);
mlinearLayout = (LinearLayout) findViewById(R.id.stoplin);
userlistTL = (TableLayout) this.findViewById(R.id.userlist);
mlinearLayout.setVisibility(View.VISIBLE); // 可见
userlistTL.removeAllViews();// 线清楚所有的view.
information();
start_re.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(ReCoredSourceActivity.this, "开启录音...", Toast.LENGTH_SHORT)
.show();
mediaRecorder = null;
record();
}
});
exit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showRadioDialog(filename);
}
});
}
// 该方法 是用来是实现录音功能并保存到制定文件中
public void record() {
if (mediaRecorder == null) {
mediaRecorder = new MediaRecorder(); // 判断是都为空 如果为空new 一个对象
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置输入源为麦克风
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频的编码
path = Environment.getExternalStorageDirectory().getPath() + "/"
+ AndroidUtils.getNowDate() + ".mp3";
mediaRecorder.setOutputFile(path);
try {
mediaRecorder.prepare(); // 准备录音
} catch (Exception e) {
e.printStackTrace();
}
mediaRecorder.start(); // 开启录音
isruning = true; // 正在录音
showProgessDialog();
}
}
public void startPlaying(String singname) {
try {
mPlayer = new MediaPlayer();
// 设置要播放的文件
mPlayer.setDataSource(Environment.getExternalStorageDirectory()
.getPath() + "/" + singname);
mPlayer.prepare();
mPlayer.start();
} catch (Exception e) {
mPlayer.release();
e.printStackTrace();
}
}
public void information() {
filename.removeAll(filename);
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File file = new File(Environment.getExternalStorageDirectory()
.getPath());
File[] files = file.listFiles();
for (File file1 : files) {
String fileName = file1.getName();
if (fileName.endsWith(".mp3")) {
filename.add(fileName);
}
}
}
for (int i = filename.size()-1; i >=0; i--) {
// 创建视图组件
TableRow tRow = new TableRow(this);
TextView nameTv = new TextView(this);
// 给视图组件设置值
nameTv.setText(filename.get(i).toString());
nameTv.setTextSize(20);
nameTv.setTextColor(Color.BLUE);
// 将视图组件添加到位tableRow
tRow.addView(nameTv);
tRow.setTag(filename.get(i).toString());
tRow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String sing_name = v.getTag().toString();
showUserEditDialog(sing_name);
}
});
// 将一行添加到TableLayout
userlistTL.addView(tRow, LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
}
}
public void showUserEditDialog(final String sing_name) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("播放录音");
dialog.setIcon(android.R.drawable.ic_dialog_alert);
dialog.setMessage("正在播放中……");
dialog.setPositiveButton("播放", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
mPlayer = null;
startPlaying(sing_name);
try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
dialog.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
} catch (Exception e) {
e.printStackTrace();
}
if(mPlayer!=null)
{
mPlayer.release();
mPlayer = null;
}
}
});
dialog.setNeutralButton("停止播放", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
// TODO Auto-generated method stub
if(mPlayer!=null)
{
mPlayer.release();
mPlayer = null;
}else
{
mPlayer = null;
}
try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
dialog.create();
dialog.show();
}
// 显示正在录音
private void showProgessDialog() {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.record01, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("正在录音中……");
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setView(view);
builder.setPositiveButton("停止录音", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whice) {
if (isruning) { // 如果正在录音
Toast.makeText(ReCoredSourceActivity.this, "终止录音...",
Toast.LENGTH_SHORT).show();
mediaRecorder.stop(); // 停止录音
mediaRecorder.release(); // 释放资源
mlinearLayout.setVisibility(View.VISIBLE); // 可见
userlistTL.removeAllViews();// 线清楚所有的view.
information();
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
八、系统测试出现的问题和解决的方案
1.问题:调用android系统内置图库的时候会出现缓存现象。
解决方案:在调用android图库中不要删除图片,在imageview所在的
视图中删除图片
2.问题:在自定义录像的功能实现会出现摄像头逆转90度
解决办法:通过得到camera对象,设置camera的参数设置为90度可
以解决此问题
3.问题:在浏览录像列表的视图中,遇到删除数据之后如何重新加载数据
解决办法:通过listview的相关方法重置listview的数据
4.问题:在自定义录像的功能中,在开始录像的时候点击停止按钮时会出
现无响应状态
解决办法:通过媒体类的内置的方法解决问题
5.问题:在录音模块中遇到如何删除录音时候如何重新加载listview的
录音数据
解决办法:和录像同样的解决办法
九、系统评价
1、主界面的视图是以格子网状态的形式居中显示,给人直观的感觉;
2、在拍照模块,不适用listview的形式来显示文件夹下所有的图片,以 至于通过点击每一项文件名来显示图片,而是通过制定文件夹的路径, 通过调用android系统内置的图库显示制定文件夹所有的图片,方便 有效;
3、在录像模块中,整个录像是自定义的,不是调用系统内置的,而且在 录像界面可以进行多种操作,例如:通过点击浏览来浏览已经存在文 件夹下的录像;
4、在录像列表中,用户通过点击录像名可以进行播放 ,删除等操作。
十、心得体会
20##年6月30号到7月9号,在学校的安排下,我们参加了应用软件开发实习。这次的生产实习是广州拓胜计算机技术服务有限公司的技术老师来给我们培训,虽然只有短短的十天,但是收获的东西却很多。
这次培训主要是针对Android软件开发,虽然我们都学过Java这么课程,有一点基础,但是我们没有系统学过软件开发的流程,通过这几天的实训,让我们亲身体会了软件从头到尾的一个系统的开发流程,了解到一个软件的生命周期,对以后的软件开发打下了基础。这次培训除了教我们编程的技术外,还锻炼了我们的其他能力。每天的晨讲、午练,还有晚上的模拟面试,都在不知不觉中锻炼了我们的个人能力,对我们大四面试及就业积累了一点经验,为我们即将离开学校,走出社会迈出了成功的第一步。
几天下来,通过一起上课,一起讨论,一起开发软件,不仅增强了同学之间的友谊,更加锻炼了我们团结协作的能力以及与他人沟通的能力,为我们以后工作打下了良好的基础。我觉得我们这一次实习是比较成功的,因为我看到我们班的同学,每天都准时起床上课,晚上准时休息,不再沉迷游戏,在晨讲、午练上,大家都向我们展示了自己的才能,这是大学三年来,我第一次体会到大家在一起学习那种快乐,大家都是全心投入实习,大家都能学习到很多在校园、在课堂上、课本上学不到的东西,也了解很多和懂得了做人的道理,特别是体会到生活中的艰辛和找工作的不容易,我希望以后还能有更多这样的实习机会,大家一起共同学习,一起努力,一起进步。
十天下来,我们不仅学到了课本上没有的知识,而且也与来给们实习的六个老师建立了深厚的感情,真心舍不得他们走,我们会记得他们所教所讲,在以后的日子里好好奋斗,为自己的梦想,拼搏不息。
真心感谢这次实习,感谢这次实习的六个教师,感谢为我们争取了这实习机会的领导。这次实习,一定会令我的人生走向新一页!
xxxx学院毕业实习报告系别:年级班级:学号:姓名:指导教师:实习类型:实习单位:实习时段:集中实习关于在XX公司从事软件开发的实…
软件开发实习报告一实习的目的与意义在本科教育中实习是一个重要的实践性教学环节通过实习可以使我们熟悉外贸实务的具体操作流程增强感性认…
软件开发实训报告组员第第1章系统概述41112系统开发背景和意义4开发环境4第2章系统需求分析521任务概述5211业务范围521…
时间过的真快一眨眼时间我在朗嘉公司为期三个多月的实习生活就要结束了而我也从学校拿到了毕业证书和学位证书我的学生生涯要暂时告一段落回…
软件开发实习报告范文一实习目的1实习单位的发展情况及实习要求北京北大方正软件技术学院是经北京市人民政府批准教育部备案由北大方正集团…
xxxx学院毕业实习报告系别:年级班级:学号:姓名:指导教师:实习类型:实习单位:实习时段:集中实习关于在XX公司从事软件开发的实…
软件开发基地生产实习报告生产实习是学校教学的一个重要的补充部分,是教育教学体系中不可缺少的重要的组成部分和不可替代的重要环节。为了…
信息科学与技术学院本科一年级软件开发实习个人总结汇总专业班级实习人数3人指导教师郝晓枫实习单位软件工程实验中心年月软件开发实习报告…
软件开发实习报告一实习的目的与意义在本科教育中实习是一个重要的实践性教学环节通过实习可以使我们熟悉外贸实务的具体操作流程增强感性认…
软件开发实习报告范文一实习目的1实习单位的发展情况及实习要求北京北大方正软件技术学院是经北京市人民政府批准教育部备案由北大方正集团…
JAVA软件开发专业实习报告一、实习的时间:20##年4月5日20##年6月20日二、实习的地点:软帝有限公司三、实习的目的:进一…