【问题标题】:Can't take picture from front face camera on Samsung Galaxy S (2.2.1)无法从三星 Galaxy S (2.2.1) 上的前置摄像头拍照
【发布时间】:2012-07-22 23:18:59
【问题描述】:

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

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

这里是错误:

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

【问题讨论】:

    标签: java android android-camera


    【解决方案1】:

    您应该获得另一个 Camera-Instance。见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: How to use Front Facing Camera on Samsung Galaxy S

    看来您必须将 PreviewSize 与 id 一起更改。

    【讨论】:

    • 嗨。我不能使用 Camera.open(int cameraId),因为它从 API 级别 9 开始可用。 但我想在旧系统上运行应用程序:8 和更早版本。
    • 是的,它非常适合 API 级别 9 及更高级别的设备:显示预览、拍照。但我正在尝试解决 API 级别 8 的问题。
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多