使用摄像头Api在android中打开摄像头

使用摄像头Api在android中打开摄像头,android,camera,Android,Camera,我已经尝试了所有现有的方法。。但每次应用程序关闭时。这是代码。请帮我调试一下 MainActivity.java package com.example.camera1; import android.os.Bundle; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Camera.Pict

我已经尝试了所有现有的方法。。但每次应用程序关闭时。这是代码。请帮我调试一下

MainActivity.java

package com.example.camera1;
import android.os.Bundle;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback; 
import android.app.Activity; 
import android.view.Menu;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView; 
import android.widget.Toast;

public class MainActivity extends Activity {

 private Camera cameraObject;

 private ShowCamera showCamera;  

 private ImageView pic; 

 public static Camera isCameraAvailiable(){

     Camera object = null; 

     try {  object = Camera.open(); 

     }       catch (Exception e){        

     }       return object;   

 }  

 private PictureCallback capturedIt = new PictureCallback() {  
      @Override      
      public void onPictureTaken(byte[] data, Camera camera) {  
      Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);       
      if(bitmap==null){        
          Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_SHORT).show();       
          }       
      else{
          Toast.makeText(getApplicationContext(), "taken", Toast.LENGTH_SHORT).show();           
          }     
      cameraObject.release(); 
      } 

     };




    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    pic = (ImageView)findViewById(R.id.imageView1);
    cameraObject = isCameraAvailiable(); 
    showCamera = new ShowCamera(this, cameraObject);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(showCamera);   

    } 

    public void snapIt(View view){   
    cameraObject.takePicture(null, null, capturedIt);   
    } 


@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;
}

}
ShowCamera.java

package com.example.camera1;

import java.io.IOException;  
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holdMe; 
 private Camera theCamera;
 public ShowCamera(Context context,Camera camera) {
    super(context);
     theCamera = camera;
     holdMe = getHolder();     
     holdMe.addCallback(this);
    // TODO Auto-generated constructor stub
}

@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
      try   {         
          theCamera.setPreviewDisplay(holder);
          theCamera.startPreview();
          } catch (IOException e)
          {     

          }   

}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

} 


 } 
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
  <FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="199dp" >

    </FrameLayout>

<Button
    android:id="@+id/button_capture"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
   android:onClick = "snapIt"
    android:text="@string/Capture"/>

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="fitXY"
    android:src="@drawable/ic_launcher"/>    

</LinearLayout>

我是为android姜饼和以上版本制作的。我的目标sdk是Android Kitkat。
在姜饼上测试应用程序时,它会打开应用程序,但只会显示一个白色屏幕,即它不会加载布局并强制关闭。。请帮忙

要打开相机,请适当使用以下代码:

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
  Camera.CameraInfo info=new Camera.CameraInfo();

  for (int i=0; i < Camera.getNumberOfCameras(); i++) {
    Camera.getCameraInfo(i, info);

    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
      camera=Camera.open(i);
    }
  }
}

if (camera == null) {
  camera=Camera.open();
}
您可以保留Camera.Parameters对象,并通过在surfaceChanged中放置复选框将参数设置为该值

<>你也可以考虑在一个单独的线程中启动你的相机,就像在这里所做的:

    //This code is from AOSP ICS:
      Thread mCameraOpenThread = new Thread(new Runnable() {
      public void run() {
          try {
              mCameraDevice = Util.openCamera(Camera.this, mCameraId);
           } catch (CameraHardwareException e) {
             mOpenCameraFail = true;
          } catch (CameraDisabledException e) {
            mCameraDisabled = true;
        }
    }
});    
这是onCreate方法:

   super.onCreate(icicle);
   mCameraOpenThread.start();
   SurfaceView preview = (SurfaceView) findViewById(R.id.camera_preview);
    SurfaceHolder holder = preview.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    // Make sure camera device is opened.
    try {
          mCameraOpenThread.join();
          mCameraOpenThread = null;
        } 
    catch(InterruptedException e)
    {
     //ignore
    }  

代码链接在这里

当应用程序强制关闭时,它会将异常放入eclipse中的“logcat”窗口中。请记住,一旦摄像头应用程序崩溃,它可能无法正确释放摄像头,因此,即使您的代码在下一轮中是正确的,在您的摄像头正确释放之前,它也无法正常工作。请放弃主要活动的onCreate方法
   super.onCreate(icicle);
   mCameraOpenThread.start();
   SurfaceView preview = (SurfaceView) findViewById(R.id.camera_preview);
    SurfaceHolder holder = preview.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    // Make sure camera device is opened.
    try {
          mCameraOpenThread.join();
          mCameraOpenThread = null;
        } 
    catch(InterruptedException e)
    {
     //ignore
    }