首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

小弟我按照demo进行摄像机的调用 就是不行?

2013-07-24 
我按照demo进行摄像机的调用 就是不行??本帖最后由 kaly_liu 于 2013-07-11 17:23:29 编辑根据网络http://

我按照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);// 指定 使用的相机 这里出错·····
就是不知道怎么改??设置流程什么的,应该都没问题吧?真不知道哪里出问题了···


[解决办法]

引用:
对啊,我现在
按照您的方法改了下,可以预览,但是我点击照相后,就出现错误了··我是在我的 手机上调试的:是安卓2.3.5的
应该是一下的函数有问题,请高手看看:

private void videoRecord() 
  {
    if(record_flag==true){
      /* */
if(record_stop){

mCamera01.unlock();// 解锁相机
mRecorder01 = new MediaRecorder();///////////?????
mRecorder01.reset();//////////
    mRecorder01.setCamera(mCamera01);// 指定 使用的相机     
   //Set the audio source
    mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//.DEFAULT
    mRecorder01.setAudioSource(MediaRecorder.VideoSource.CAMERA);
 
    mRecorder01.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
    //CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_BACK, CamcorderProfile.QUALITY_LOW);
    //mRecorder01.setProfile(mCamcorderProfile);    
    
//Set the video output format and encoding.
 //   mRecorder01.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//3GP   MPEG_4=>MP4
 //   mRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置   音频 编码类型
 //   mRecorder01.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置 视频编码类型


    
    
    
    //Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() 
    File myRecordFile = new File(strCaptureVideoFilePath);
    mRecorder01.setOutputFile(myRecordFile.toString());
    
//    mRecorder01.setVideoFrameRate(5);    
//    mRecorder01.setVideoSize(320, 240);      
      
      
      //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();
    }/**/

      mRecorder01.start();
      record_stop=false;  
      mButton03.setText("Stop");
}
else
  {
//release media recorder
releaseRecorder();
    //release Camera
    mButton03.setText("Capture");
    resetCamera();    
    record_stop = true;
  }
    }
  }
/**/ 


Quote: 引用:

http://blog.csdn.net/shen332401890/article/details/8819564 

看一下 上传的资源 可能因为 CSDN的原因 有损坏 不过 已经分析的很清楚了


把你的错误log 贴一下 
还有 你可以根据我那篇 日志
和日志下面的 源代码  那个源代码 我调试成功的

热点排行