1、因为Api的兼容问题,,mediarecorder的启动方式也不同了,因为我看的视频是api 8的因此无法启动,在网上查了了好多资料都没说清楚,最终还是去官网查看才得以实现:
官网实现的方式:
我实现的demo,希望给跟我一样的初学者一点帮助,少走弯路:
需要权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
main_xml文件
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context="com.example.mycamera.MainActivity$PlaceholderFragment"
>
<SurfaceView
android:layout_weight="100"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/camera"
/>
<RelativeLayout
android:layout_weight="0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始录制"
android:layout_alignParentRight="true"
android:id="@+id/pz"
android:onClick="luxiang"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"
android:id="@+id/dj"
android:layout_toLeftOf="@+id/pz"
android:onClick="tingzhi"
/>
</RelativeLayout>
</LinearLayout>
public class MainActivity extends ActionBarActivity {//ActionBarActivity
private SurfaceView sv;
private SurfaceHolder holder;
private Camera mCamera;
private MediaRecorder recorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏
setContentView(R.layout.activity_main);
sv=(SurfaceView) findViewById(R.id.camera);
holder=sv.getHolder();
holder.addCallback(new MyCallback());
}
public void tingzhi(View v)
{
recorder.release();
recorder=null;
}
public void luxiang(View v) throws IOException
{
recorder=new MediaRecorder();
recorder.reset();
mCamera.unlock();
recorder.setCamera(mCamera);
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//设定音源摄像机
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));//指定录像的质量
recorder.setOutputFile("data/data/musics/hahagaga.3gp");
// 第5步:指定预览输出
recorder.setPreviewDisplay(holder.getSurface());
try {
recorder.prepare();
} catch (Exception e) {
recorder.release();
}
recorder.start();
// recorder=new MediaRecorder();
// recorder.reset();
// recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
video-size-values=640x480,576x432,480x320,432x240,384x288,352x288,320x240,240x160,176x144
preview-size-values=640x480,576x432,480x320,432x240,384x288,352x288,320x240,240x160,176x144
// recorder.setVideoSize(576, 432);
// recorder.setVideoFrameRate(5);
// recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// recorder.setOutputFile("data/data/musics/hahagaga.3gp");
// recorder.setPreviewDisplay(holder.getSurface());
// try{
// recorder.prepare();
// }catch(Exception e)
// {
// System.out.println("准备失败");
// e.printStackTrace();
// }
// try{
// recorder.start();
// }catch(Exception e)
// {
// System.out.println("开始失败");
// e.printStackTrace();
// }
}
class MyPictureCallback implements PictureCallback
{
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//dada就是拍照后压缩的数据
File image=new File(Environment.getDataDirectory(),"zp.jpg");
FileOutputStream out=null;
try {
out=new FileOutputStream(image);
out.write(data);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "保存照片失败!", Toast.LENGTH_LONG).show();
}
finally
{
// mCamera.startPreview();
}
}
}
class MyCallback implements Callback
{
@Override
public void surfaceCreated(SurfaceHolder holder) {
//录像
mCamera=Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mCamera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// mCamera.release();
// mCamera=null;
}
}
}