1

我正在使用此处描述的相机:Android Camera will not work。开始预览失败。如果我使用后置摄像头,它工作正常!预览作品,我可以拍照。

但是,当我通过设置参数使用前置摄像头时:它会在方法parameter.set("camera-id", 2)上引发错误。预览效果很好,我可以在 SurfaceView 上看到自己。但是我不能拍照。camera.takePicture(...)

这是错误:

> 07-24 21:59:52.926: E/AndroidRuntime(2462): Caused by: java.lang.RuntimeException:
> takePicture failed
> at android.hardware.Camera.native_takePicture(Native Method)
> at android.hardware.Camera.takePicture(Camera.java:672)
> at android.hardware.Camera.takePicture(Camera.java:636)
> at org.omich.alarm.PhotoController.takePhoto(PhotoController.java:94)
> ... 15 more

这是我的代码:

public class Photo
{
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;

    private Camera mCamera;
    private CameraCallback mCameraCallback;

    public Photo (Activity context)
    {
        mSurfaceView = (SurfaceView)context.findViewById(R.id.surfaceView);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(new SurfaceCallback());
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void takePhoto ()
    {
        if(mCameraCallback == null)
        {
            mCameraCallback = new CameraCallback();
        }

        try
        {
            mCamera.takePicture(null, null, mCameraCallback);
        }
        catch (Throwable e)
        {
            Log.d("ERROR!!! takePicture error");
        }
    }

    //========================================================================  

//  private int getFrontCameraId()
//  {
//      CameraInfo ci = new CameraInfo();
//      for (int i = 0 ; i < Camera.getNumberOfCameras(); i++)
//      {
//          Camera.getCameraInfo(i, ci);
//          if (ci.facing == CameraInfo.CAMERA_FACING_FRONT)
//          {
//              return i;
//          }
//      }
//      return -1; // No front-facing camera found
//  }

    private static class CameraCallback implements Camera.PictureCallback
    {
        @Override
        public void onPictureTaken(byte[] data, Camera camera)
        {
            Log.d("Yahoo! Photo taken");
        }       
    }

    private class SurfaceCallback implements SurfaceHolder.Callback
    {
        //==== SurfaceHolder.Callback ============================================
        @Override  
        public void surfaceChanged(SurfaceHolder arg0, int format, int width, int height)  
        {
            Camera camera = mCamera;

            Parameters p = camera.getParameters();
            if(p != null)
            {
                p.setPreviewSize(width, height);
                p.set("camera-id", 2);
                camera.setParameters(p);
            }

            try
            {
                camera.setPreviewDisplay(mSurfaceHolder);
                camera.startPreview();
            }
            catch (IOException e)
            {
                Log.d("setPreviewDisplay error");
            }
            catch (Throwable e)
            {
                Log.d("startPreview error");
            }
        }

        @Override  
        public void surfaceCreated(SurfaceHolder holder)  
        {
//          mCamera = Camera.open(getFrontCameraId());
            mCamera = Camera.open();
        }

        @Override  
        public void surfaceDestroyed(SurfaceHolder holder)
        {
            mCamera.stopPreview();
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
        }
    }
}
4

1 回答 1

1

你应该得到另一个相机实例。请参阅Camera.open(int cameraId)。您必须找出前置摄像头的 ID 并将其与上述方法一起使用。

更新:

采用 Android API 7、8 级解决方案的三星 Galaxy S

在 Camera mCamera = Camera.open() 使用 setFrontCamera(mCamera) 之后:

void setFrontCamera(Camera camera) {
    Camera.Parameters parameters = camera.getParameters();
    parameters.set("camera-id", 2);
    // (800, 480) is also supported front camera preview size at Samsung Galaxy S.
    parameters.setPreviewSize(640, 480); 
    camera.setParameters(parameters);
}

三星还链接到 SO: 如何在三星 Galaxy S 上使用前置摄像头

看来您必须更改 PreviewSize 以及 id。

于 2012-07-31T11:46:33.010 回答