本帖最后由 kaly_liu 于 2013-07-11 17:23:29 编辑

解决方案 »

  1.   

    权限,你的minSdk是不是跟DEMO一样
      

  2.   

    http://blog.csdn.net/shen332401890/article/details/8819564 看一下 上传的资源 可能因为 CSDN的原因 有损坏 不过 已经分析的很清楚了
      

  3.   

    <uses-permission android:name = "android.permission.CAMERA" />
    <uses-feature android:name = "android.hardware.camera" />
    <uses-feature android:name = "android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_VIDEO"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
    我感觉应该不是这个问题,也许是我程序的哪里没弄清楚,我在研究下··
      

  4.   

    MediaRecorder的配置很奇葩的,在这个机器上可用,换个机器又不行了,各种麻烦。
      

  5.   

    对啊,我现在
    按照您的方法改了下,可以预览,但是我点击照相后,就出现错误了··我是在我的 手机上调试的:是安卓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;
      }
        }
      }
    /**/ 
      

  6.   

    我记得录像的话好像是需要区分手机的之前我也是无法播放,待会我贴代码给你你看看,联想HTC需要注释几行代码
      

  7.   


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

  8.   

    recorder.setVideoSize(176, 144);
    recorder.setVideoFrameRate(20);
    这2行需要注释才可以,楼主可以试试的
      

  9.   

     mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//.DEFAULT
                mRecorder01.setAudioSource(MediaRecorder.VideoSource.CAMERA); mRecorder01.setVideoSource(MediaRecorder.VideoSource.CAMERA);应该是这样吧  仔细点应该能该对 在核对一下代码
      

  10.   

    楼上的贴错了,额···下面才是代码: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.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.CameraInfo;
    import android.hardware.Camera.PictureCallback;
    import android.hardware.Camera.ShutterCallback;import android.media.CamcorderProfile;
    import android.media.MediaRecorder;
    import android.media.CameraProfile;import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.view.Menu;
    import android.view.Surface;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View.OnClickListener;import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;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 = true;
      private boolean record_flag = false;
      private boolean record_stop = true;
      
      
      /*利用时间作为 文件的名称*/
     // String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
      private String strCaptureFilePath ;   
      private String strCaptureVideoFilePath;
      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)
          {   String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
           strCaptureFilePath = "/sdcard/DCIM/Camera"+File.separator+"img_"+timeStamp+".jpg";
           takePicture();
          }
         });
        
        mButton03.setOnClickListener(new Button.OnClickListener()
        {
          @Override
          public void onClick(View arg0)
          {   String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
           strCaptureVideoFilePath = "/sdcard/DCIM/Camera"+File.separator+"vid_"+timeStamp+".mp4";
           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){
         mButton03.setText("Capture");
         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.setDisplayOrientation(180);
        
         mCamera01.startPreview();
         bIfPreview = true;
         //     
         }
         }
       }

    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.VideoSource.CAMERA);
         mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//.DEFAULT
         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
        
        resetCamera();     
        record_stop = true;
        mButton03.setText("Capture");
      }
        }
      }
    /**/ 
    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()
      {
      if(mRecorder01!=null){
        mRecorder01.stop();
        //mCamera01.lock();
        mRecorder01.reset();
        mRecorder01.release();
        mRecorder01 = null;
        //     
     /*  try {
    mCamera01.reconnect();
    } catch (IOException e) {
    Toast.makeText(this, "reconect fail", 0).show();
    e.printStackTrace();
    }*/ 
        }   
      }   /* */
      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();
    }
    }