1

我在这里有一段简单的代码,但由于某种原因它没有存储数据。我确定这很愚蠢,但我似乎无法弄清楚。任何帮助将不胜感激。

    private byte[] picture;

    public void takePicture(){
    Camera camera = Camera.open();
    Camera.Parameters parameters = camera.getParameters();
    parameters.set("camera-id",2);
            camera.setParameters(parameters);
    parameters.set("gps-timestamp", "1233744883");
    camera.setParameters(parameters);
    Log.i("method", "in takePicture()");
    camera.takePicture(null, rawCallback, null);
    camera.release();
}

    PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
    // TODO Do something with the image RAW data.
        Log.i("rawcallback", "in rawcallback");
        picture = data;
    }
};

当我运行代码时,不会调用回调中的日志,也不会调用“图片”保存“数据”。有什么想法吗?我正在尝试用前置摄像头拍照,我是否需要一些特别的东西,我没有这样做?

我也有这些权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
4

2 回答 2

2

最后一个参数Camera.takePicture()对应JPEG回调。因此,您应该parameters.setPictureFormat(PixelFormat.JPEG);在 camera.setParameters() 调用之前添加该行。或camera.takePicture(null, rawCallback, null);改为使用。

您还应该确保在AndroidManifest.xml中有以下行:

 <uses-permission android:name="android.permission.CAMERA" />
 <uses-feature android:name="android.hardware.camera" />  

从我的评论:

用于访问字体摄像头的API仅出现在 Android 2.3(API 版本 9)中。在早期版本中,您应该使用供应商特定的技术。看看这个适用于 Galaxy S的工作解决方案:

Camera.Parameters parameters = mCamera.getParameters();
parameters.set("camera-id", 2);
parameters.setPreviewSize(640, 480); // or (800,480) this is supported front camera preview size @ Samsung Galaxy S
mCamera.setParameters(parameters);

我希望它会帮助你。如果没有,请尝试使用setPreviewSize上述参数。

于 2011-03-16T22:06:22.213 回答
1

我在 JPEG 回调中遇到了类似的问题。拍照后并不总是调用它。这可能是因为您过早释放相机。

在释放相机或退出应用程序之前,您应该等待所有回调都返回。Camera 类不是线程安全的。回调将在事件线程open(int)被调用时被调用。(见文档

我设法通过使用该setJpegQuality()函数降低 JPEG 质量来更频繁地调用它,以减少要计算的数据。但更好的方法应该是等到回调返回。

根据Android 代码文档,您还需要将 SurfaceHolder 传递给 Camera 并在拍照之前开始预览。出于我的目的,我想在用户屏幕上没有任何预览的情况下拍照。我使用了本地 SurfaceView,但您可以使用另一个。

我建议类似:

Camera.PictureCallback myPictureCallback_jpeg = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {
            //save your data
        }
    };

    SurfaceView mySurfaceView = new SurfaceView(this);
    SurfaceHolder mySurfaceHolder = mySurfaceView.getHolder();
    Camera  myCamera = Camera.open();

    try {
        myCamera.setPreviewDisplay(mySurfaceHolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    Camera.Parameters p = myCamera.getParameters();
    p.setJpegQuality(70);//a value between 1 and 100
    myCamera.setParameters(p);
    myCamera.startPreview();
    myCamera.takePicture(null, null, null, myPictureCallback_jpeg);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    myCamera.release();
于 2011-05-05T16:04:41.737 回答