我按照demo进行摄像机的调用 就是不行??
本帖最后由 kaly_liu 于 2013-07-11 17:23:29 编辑 根据网络http://developer.android.com/guide/topics/media/camera.html#capture-video资料进行编程,想实现 摄像机的摄像,可是不知道为什么我的总是出错啊,下载别人的程序,却可以运行,比较来比较去好像没什么区别,请高手帮我看看,哪里有错啊? 里面我设置了 camera_flag 和 record_flag,只有对应的为 true的时候,程序有效。camera是可以的,但是我的recorder就是不行,求教,如下是我的代码啊:
package com.cameraapi;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.view.Menu;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.hardware.*;
import android.media.*;
public class MainActivity extends Activity implements SurfaceHolder.Callback{//
private Camera mCamera01;
private Button mButton01, mButton02, mButton03;//, mButton04
private ImageView mImageView01;
private SurfaceView mSurfaceView01;
private SurfaceHolder mSurfaceHolder01;
private boolean bIfPreview = false;
//设置时 录像 还是拍照
private boolean camera_flag = false;
private boolean record_flag = true;
private boolean record_stop = false;
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
private String strCaptureFilePath = "/sdcard/DCIM"+File.separator+"img_"+timeStamp+".jpg";
private String strCaptureVideoFilePath = "/sdcard/DCIM"+File.separator+"vid_"+timeStamp+".mp4";
private MediaRecorder mRecorder01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// mTextView01 = (TextView) findViewById(R.id.textView1);
mImageView01 = (ImageView) findViewById(R.id.imageView1);
mSurfaceView01 = (SurfaceView) findViewById(R.id.surfaceView1);
mSurfaceHolder01 = mSurfaceView01.getHolder();
mSurfaceHolder01.addCallback(MainActivity.this);
mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mButton01 = (Button)findViewById(R.id.button1);
mButton02 = (Button)findViewById(R.id.button2);
mButton03 = (Button)findViewById(R.id.button3);
// mButton04 = (Button)findViewById(R.id.button4);
mButton01.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{
initCamera();
}
});
mButton02.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{
takePicture();
}
});
mButton03.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{
videoRecord();
}
});
}
private void initCamera()
{
if(camera_flag == true){
mButton03.setEnabled(false);
if(!bIfPreview)
{
mCamera01 = Camera.open();
}
if (mCamera01 != null && !bIfPreview)
{
Camera.Parameters parameters = mCamera01.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(320, 240);
parameters.setPictureSize(320, 240);
mCamera01.setParameters(parameters);
try{
mCamera01.setPreviewDisplay(mSurfaceHolder01);}
catch(Exception e){
e.printStackTrace();
}
mCamera01.startPreview();
bIfPreview = true;
}
}else if(record_flag == true){
mButton02.setEnabled(false);
if(!bIfPreview)
{
mCamera01 = Camera.open();
}
if (mCamera01 != null && !bIfPreview)
{
try {
mCamera01.setPreviewDisplay(mSurfaceHolder01);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mCamera01.startPreview();
bIfPreview = true;
//
mCamera01.unlock();// 解锁相机
mRecorder01.setCamera(mCamera01);// 指定 使用的相机
//Set the audio source
mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mRecorder01.setAudioSource(MediaRecorder.VideoSource.CAMERA);
mRecorder01.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
//Set the video output format and encoding.
//mRecorder01.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//Set the output format
//mRecorder01.setOutputFormat(MediaRecorder.AudioEncoder.AMR_NB);//设置 音频 编码类型
//mRecorder01.setOutputFormat(MediaRecorder.VideoEncoder.MPEG_4_SP);//设置 视频编码类型
//Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()
File myRecordFile = new File(strCaptureVideoFilePath);
mRecorder01.setOutputFile(myRecordFile.toString());
//Specify the SurfaceView preview layout element for your application
mRecorder01.setPreviewDisplay(mSurfaceView01.getHolder().getSurface());
//Prepare the MediaRecorder
try {
mRecorder01.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
releaseRecorder();
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
releaseRecorder();
e.printStackTrace();
}/**/
}
}
}
private void videoRecord()
{
if(record_flag==true){
if(record_stop){
mRecorder01.start();
record_stop=false;
mButton03.setText("Stop");
}
else
{
//release media recorder
releaseRecorder();
//release Camera
mButton03.setText("Capture");
resetCamera();
record_stop = true;
}
}
}
private void takePicture()
{
if (mCamera01 != null && bIfPreview)
{
mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);
}
}
private ShutterCallback shutterCallback = new ShutterCallback()
{
public void onShutter()
{
// Shutter has closed
}
};
private PictureCallback rawCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle RAW image data
}
};
private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle JPEG image data
Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length);
File myCaptureFile = new File(strCaptureFilePath);
try
{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
// mImageView01.setImageBitmap(bm);
resetCamera();
initCamera();
}
catch (Exception e)
{
}
}
};
private void releaseRecorder()
{
mRecorder01.stop();
mRecorder01.reset();
mRecorder01.release();
mRecorder01 = null;
mCamera01.lock();
}
private void resetCamera()
{
if (mCamera01 != null && bIfPreview)
{
mCamera01.stopPreview();
mCamera01.release();
mCamera01 = null;
bIfPreview = false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera01.release();
}
}
我有调试了下,发现在 mRecorder01.setCamera(mCamera01);// 指定 使用的相机 这里出错
就是不知道怎么改??设置流程什么的,应该都没问题吧?真不知道哪里出问题了
[解决办法]
把你的错误log 贴一下
还有 你可以根据我那篇 日志
和日志下面的 源代码 那个源代码 我调试成功的