2015-05-16 183 views
0

这个想法很简单:我的应用程序应该创建一个摄像头对象,显示预览并拍照(不按任何按钮),然后关闭摄像头。不幸的是,它甚至没有拍照。 (意思是:我的回调代码应在拍摄照片后执行)永远不会达到。)android:摄像头不拍摄

我正在为android相机api使用一个小包装类。我的活动代码如下所示:

camera = new SurveillanceCamera(this, layoutForPreview); 
camera.start(); 
camera.takePicture(); 

包装类:

public SurveillanceCamera(Context context, LinearLayout previewLayout) { 
    cameraInstance = Camera.open(findBackFacingCamera()); 
    pictureCallback = getPictureCallback(); 
    cameraPreview = new CameraPreview(context, cameraInstance); 
    this.previewLayout = previewLayout; 
    this.previewLayout.addView(cameraPreview); 
    cameraInstance.startPreview(); 
    } 

    public void takePicture() { 
    //this code is reached 
    cameraInstance.takePicture(null, null, pictureCallback); 
    } 

    public void start() { 
    if (cameraInstance == null) { 
     cameraInstance = Camera.open(findBackFacingCamera()); 
     pictureCallback = getPictureCallback(); 
     cameraPreview.setCamera(cameraInstance); 
     cameraInstance.startPreview(); 
    } 
    } 

    private PictureCallback getPictureCallback() { 
    PictureCallback picture = new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
     Log.e(TAG, "Jey picture was taken..."); 
     // refresh camera to continue preview 
     cameraPreview.refreshCamera(cameraInstance); 
     } 
    }; 
    return picture; 
    } 

    private int findBackFacingCamera() { 
    int cameraId = -1; 
    // Search for the back facing camera 
    // get the number of cameras 
    int numberOfCameras = Camera.getNumberOfCameras(); 
    // for every camera check 
    for (int i = 0; i < numberOfCameras; i++) { 
     CameraInfo info = new CameraInfo(); 
     Camera.getCameraInfo(i, info); 
     if (info.facing == CameraInfo.CAMERA_FACING_BACK) { 
     cameraId = i; 
     break; 
     } 
    } 
    return cameraId; 
    } 

没有例外的代码中引发,但在onPictureTaken的Log.e()不显示。看起来,相机预览显示,但没有任何反应。是否有可能,执行camera.takePicture()时,预览未完全加载?有什么建议么?

+0

http://examples.javacodegeeks.com/android/core/hardware/camera-hardware/android-camera-example/&http://www.tutorialspoint.com/android/android_camera.htm –

+0

对不起,但那是不是一个非常有用的答案。我已经检查了很多教程。我的相机正在拍照,如果我只是使用一个按钮来触发camera.takePicture()方法。但如果我试图直接拍摄照片,如上所示,它不起作用。为什么?以及如何在没有按钮触发事件的情况下拍照? –

回答

0

您的怀疑很可能是有道理的。我没有看到什么时候setPreviewDisplay()被调用。但是这个电话应该完成takePicture()才能成功。

这是不可能简单地调用

camera = new SurveillanceCamera(this, layoutForPreview); 
camera.start(); 
camera.takePicture(); 

因为要完成一个setPreviewDisplay()通话,你需要一个完全初始化持有人的实例,但你只能在构造函数中添加表面视图。

最好注册一个SurfaceHolder.Callback并从surfaceChanged()回调中调用takePicture()

相关问题