- 论坛徽章:
- 0
|
最近初学安卓开发,然后做了个录像程序,用的是MediaRecorder,一共2个按钮,一个录像,一个停止录像,自己实现了一个类 MovieRecorder,里面有录像和停止录像两块功能,按钮事件触发分别调用类中的两个成员函数,但是现在问题是,我在按下录像的时候可以进行录像,但是在按下停止录像的时候事件已经触发,但是停止不了录像,不知道怎么回事,以下是我的代码,求各位大神帮忙看一下,谢谢!
这里是Activity_main的:- package com.example.sandao.cameraupload2;
- import android.media.MediaRecorder;
- import android.os.Environment;
- import android.os.Handler;
- import android.os.Message;
- import android.support.v7.app.ActionBarActivity;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.view.SubMenu;
- import android.view.SurfaceView;
- import android.view.View;
- import android.widget.ImageButton;
- import android.widget.Toast;
- import java.io.File;
- public class MainActivity extends ActionBarActivity {
- // 程序中的两个按钮
- ImageButton record , stop , upload;
- // 显示视频预览的SurfaceView
- SurfaceView sView;
- MovieRecorder movierecorder;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- movierecorder = new MovieRecorder();
- // 获取程序界面中的三个按钮
- record = (ImageButton) findViewById(R.id.record);
- stop = (ImageButton) findViewById(R.id.stop);
- upload = (ImageButton) findViewById(R.id.upload);
- if (!Environment.getExternalStorageState().equals(
- android.os.Environment.MEDIA_MOUNTED))
- {
- Toast.makeText(MainActivity.this
- , "SD卡不存在,请插入SD卡!"
- , Toast.LENGTH_SHORT).show();
- return;
- }
- File sd=Environment.getExternalStorageDirectory();
- String path=sd.getPath()+"/Camera_upload";
- File file=new File(path);
- if(!file.exists())
- {
- Toast.makeText(MainActivity.this
- , "存储目录不存在,创建目录!"
- , Toast.LENGTH_SHORT).show();
- file.mkdir();
- }
- // 让stop按钮不可用
- stop.setEnabled(false);
- // 获取程序界面中的SurfaceView
- sView = (SurfaceView) this.findViewById(R.id.sView);
- // 设置分辨率
- sView.getHolder().setFixedSize(320, 280);
- // 设置该组件让屏幕不会自动关闭
- sView.getHolder().setKeepScreenOn(true);
- }
- public boolean onCreateOptionsMenu(Menu menu)
- {
- MenuInflater inflator = new MenuInflater(this);
- //装填R.menu.my_menu对应的菜单,并添加到menu中
- inflator.inflate(R.menu.menu_main, menu);
- return super.onCreateOptionsMenu(menu);
- }
- public void RecorderHandler(View source)
- {
- Toast.makeText(MainActivity.this
- , "单击了recorder键!"
- , Toast.LENGTH_SHORT).show();
- record = (ImageButton) findViewById(R.id.record);
- stop = (ImageButton) findViewById(R.id.stop);
- movierecorder.startRecording(sView,record,stop);
- }
- public void StopHandler(View source)
- {
- movierecorder.stopRecording();
- }
- public void UploadHandler(View source)
- {
- Toast.makeText(MainActivity.this
- , "单击了Upload键!"
- , Toast.LENGTH_SHORT).show();
- }
- }
复制代码 这是我自己的类, MovieRecorder:- package com.example.sandao.cameraupload2;
- import android.hardware.Camera;
- import android.media.MediaRecorder;
- import android.view.SurfaceView;
- import android.widget.ImageButton;
- import java.io.File;
- import java.io.IOException;
- import java.util.Timer;
- import java.util.TimerTask;
- import static com.example.sandao.cameraupload2.MainActivity.*;
- /**
- * Created by Administrator on 2015/9/26 0026.
- */
- public class MovieRecorder{
- private MediaRecorder mRecorder;
- boolean isRecording;
- File videoFile ;
- ImageButton record , stop;
- public void startRecording(SurfaceView surfaceView,ImageButton mainrecord,ImageButton mainstop) {
- // 创建MediaRecorder对象
- mRecorder = new MediaRecorder();
- record = mainrecord;
- stop = mainstop;
- // 创建保存录制视频的视频文件
- videoFile = new File("/mnt/sdcard/Camera_upload/myvideo.3gp");
- mRecorder.reset();
- //调转摄像头
- Camera c = Camera.open();
- c.setDisplayOrientation(90);
- c.unlock();
- mRecorder.setCamera(c);
- // 设置从麦克风采集声音
- mRecorder.setAudioSource(MediaRecorder
- .AudioSource.MIC);
- // 设置从摄像头采集图像
- mRecorder.setVideoSource(MediaRecorder
- .VideoSource.CAMERA);
- // 设置视频文件的输出格式
- // 必须在设置声音编码格式、图像编码格式之前设置
- mRecorder.setOutputFormat(MediaRecorder
- .OutputFormat.MPEG_4);
- // 设置声音编码的格式
- mRecorder.setAudioEncoder(MediaRecorder
- .AudioEncoder.DEFAULT);
- // 设置图像编码的格式
- mRecorder.setVideoEncoder(MediaRecorder
- .VideoEncoder.MPEG_4_SP);
- mRecorder.setVideoSize(320, 240);
- // 每秒 20帧
- //mRecorder.setVideoFrameRate(10);
- mRecorder.setOutputFile(videoFile.getAbsolutePath());
- // 指定使用SurfaceView来预览视频
- mRecorder.setPreviewDisplay(surfaceView
- .getHolder().getSurface());
- try{
- mRecorder.prepare();
- // 开始录制
- mRecorder.start();
- System.out.println("---recording---");
- // 让record按钮不可用
- record.setEnabled(false);
- // 让stop按钮可用
- stop.setEnabled(true);
- } catch (Exception e) {
- e.printStackTrace();
- }
- isRecording = true;
- }
- public void stopRecording()
- {
- if(mRecorder != null) {
- // 停止录制
- mRecorder.stop();
- // 释放资源
- mRecorder.release();
- mRecorder = null;
- // 让record按钮可用
- record.setEnabled(true);
- // 让stop按钮不可用
- stop.setEnabled(false);
- }
- }
- }
复制代码 |
|