应用软件开发实习报告

 

课程实习

评语:


目录

一、课程设计目的......................................................... 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这么课程,有一点基础,但是我们没有系统学过软件开发的流程,通过这几天的实训,让我们亲身体会了软件从头到尾的一个系统的开发流程,了解到一个软件的生命周期,对以后的软件开发打下了基础。这次培训除了教我们编程的技术外,还锻炼了我们的其他能力。每天的晨讲、午练,还有晚上的模拟面试,都在不知不觉中锻炼了我们的个人能力,对我们大四面试及就业积累了一点经验,为我们即将离开学校,走出社会迈出了成功的第一步。

几天下来,通过一起上课,一起讨论,一起开发软件,不仅增强了同学之间的友谊,更加锻炼了我们团结协作的能力以及与他人沟通的能力,为我们以后工作打下了良好的基础。我觉得我们这一次实习是比较成功的,因为我看到我们班的同学,每天都准时起床上课,晚上准时休息,不再沉迷游戏,在晨讲、午练上,大家都向我们展示了自己的才能,这是大学三年来,我第一次体会到大家在一起学习那种快乐,大家都是全心投入实习,大家都能学习到很多在校园、在课堂上、课本上学不到的东西,也了解很多和懂得了做人的道理,特别是体会到生活中的艰辛和找工作的不容易,我希望以后还能有更多这样的实习机会,大家一起共同学习,一起努力,一起进步。

十天下来,我们不仅学到了课本上没有的知识,而且也与来给们实习的六个老师建立了深厚的感情,真心舍不得他们走,我们会记得他们所教所讲,在以后的日子里好好奋斗,为自己的梦想,拼搏不息。

真心感谢这次实习,感谢这次实习的六个教师,感谢为我们争取了这实习机会的领导。这次实习,一定会令我的人生走向新一页! 

相关推荐