使用Camera Api在android中打开相机

时间:2014-01-27 11:30:23

标签: 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.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。 在姜饼上测试应用程序时打开应用程序,但只是显示一个白色的屏幕,它没有加载布局和强制关闭..请帮助.. !!

1 个答案:

答案 0 :(得分:0)

要打开相机,请正确使用以下代码:

   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();
}

将SurfaceView添加到FrameLayout以显示它。

您可以改为使用全局Camera实例变量而不是返回Camera。相机在onPause中被释放,如下所示:

    mCamera.release();
    mCamera=null;
   //remove SurfaceView from the FrameLayout you added it to    

您可以保留Camera.Parameters对象,并使用它通过检查surfaceChanged来设置值的参数。

你也可以考虑在onCreate中单独创建一个Thread,就像在这里完成一样:

    //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
    }  

代码链接位于http://android.googlesource.com/platform/packages/apps/Camera/+/ics-factoryrom-2-release/src/com/android/camera/Camera.java

相关问题