代码如下:package com.example.meadiarecorder3;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements SurfaceHolder.Callback{
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private TextView tvTime;
private TextView tvSize;
private Button btnStart;
private Button btnStop;
private Button btnCancel;
private MediaRecorder recorder;
private Handler handler;
private Camera camera;
private boolean recording; // 记录是否正在录像,fasle为未录像, true 为正在录像
private int minute = 0;
private int second = 0;
private String time = "";
private String size = "";
private String name;
private File viodFile;
private Runnable timeRun = new Runnable() {
@Override
public void run() {
long fileLength = viodFile.length();
if (fileLength < 1024 && fileLength > 0) {
size = String.format("%dB/10M", fileLength);
} else if (fileLength >= 1024 && fileLength < (1024 * 1024)) {
fileLength = fileLength / 1024;
size = String.format("%dK/10M", fileLength);
} else if (fileLength > (1024 * 1024 * 1024)) {
fileLength = (fileLength / 1024) / 1024;
size = String.format("%dM/10M", fileLength);
}
second++;
if (second == 60) {
minute++;
second = 0;
}
time = String.format("%02d:%02d", minute, second);
tvSize.setText(viodFile.getAbsolutePath());
tvTime.setText(time);
handler.postDelayed(timeRun, 1000);
}
};
private Button start;// 开始录制按钮
private Button stop;// 停止录制按钮
private MediaRecorder mediarecorder;// 录制视频的类
private SurfaceView surfaceview;// 显示视频的控件
// 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
// 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口
private SurfaceHolder surfaceHolder;
private String fileName;
private SurfaceHolder holder;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
// 设置横屏显示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
// 选择支持半透明模式,在有surfaceview的activity中使用。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.activity_main);
fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
name = "video_" + System.currentTimeMillis() + ".mp4";
fileName += File.separator + File.separator + "Ruanko_Jobseeker"
+ File.separator + name;
name = "video_" + System.currentTimeMillis() + ".mp4";
tvSize = (TextView) findViewById(R.id.tv_video_size);
tvTime = (TextView) findViewById(R.id.tv_video_time);
handler= new Handler();
init();
}
private void init() {
start = (Button) this.findViewById(R.id.start);
stop = (Button) this.findViewById(R.id.stop);
start.setOnClickListener(new TestVideoListener());
stop.setOnClickListener(new TestVideoListener());
surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);
holder = surfaceview.getHolder();
holder.addCallback(this); // holder加入回调接口
// setType必须设置,要不出错.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
class TestVideoListener implements OnClickListener {
private static final String TAG = "MainActivity";
@Override
public void onClick(View v) {
if (v == start) {
try {
viodFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4");
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(getApplicationContext(), "SD卡不存在,请插卡", 0).show();
return;
}else{
if(!viodFile.exists()){
viodFile.getParentFile().mkdirs();
viodFile.createNewFile();
}
}
mediarecorder = new MediaRecorder();// 创建mediarecorder对象
// 设置录制视频源为Camera(相机)
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置从麦克风采集声音
mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 设置录制的视频编码h263 h264
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediarecorder.setAudioEncoder(MediaRecorder.VideoEncoder.DEFAULT);
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoSize(176, 144);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoFrameRate(20);
mediarecorder.setPreviewDisplay(holder.getSurface());
// 设置视频文件输出的路径
mediarecorder.setOutputFile(viodFile.getAbsolutePath());
System.out.println("viodFile.getAbsolutePath()的值为:"+viodFile.getAbsolutePath());
// 准备录制
mediarecorder.prepare();
// 开始录制
mediarecorder.start();
handler.post(timeRun);
} catch (IOException e2) {
e2.printStackTrace();
}
}
if (v == stop) {
Log.i(TAG, viodFile.toString());
if (mediarecorder != null) {
handler.removeCallbacks(timeRun);
// 停止录制
mediarecorder.stop();
// 释放资源
mediarecorder.release();
mediarecorder = null;
}
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder = holder;
}
public void surfaceCreated(SurfaceHolder holder) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder = holder;
}
public void surfaceDestroyed(SurfaceHolder holder) {
// surfaceDestroyed的时候同时对象设置为null
surfaceview = null;
holder = null;
mediarecorder = null;
}
}
代码是没问题的 可以运行 可以录制和暂停 设置录制视频地址的代码是
viodFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4");
mediarecorder.setOutputFile(viodFile.getAbsolutePath());
这两行已经把地址设置好了
按道理来说 录完之后就可以找到文件了 但是没有!
求助各位大神,到底是哪里出了问题,有录制视频的号框架推荐就指点一二,或者有更好的代码就发小弟一份,不胜感激。。