在AutoFocusCallback中调用takePicture会导致错误100

时间:2013-02-15 22:58:29

标签: android camera android-camera autofocus

我遇到了我认为特定于设备的问题,但我想看看其他人之前是否曾见过这种行为。下面是我用来在相机活动中捕获JPEG的代码:

surfaceView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        camera.autoFocus(new AutoFocusCallback() {

            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if(success)
                {                           
                    Log.d(TAG, "Focusing...successful.");
                    camera.takePicture(null, null, null, jpegCallback);
                }
                else
                {
                    Log.d(TAG, "Focusing...failed.");
                }

            }

        });
    }
});

此代码在我的Nexus 4上完美运行,但是今天下午我在三星Galaxy S3上尝试了它,并且相机服务器因以下错误消息而崩溃:

Focusing...successful.
Camera server died!
ICamera died
Error 100

从LogCat可以看出,调用camera.takePicture(...)时会发生故障(即永远不会调用jpegCallback)。后来我找了一个带有三星Galaxy Note的朋友来试试,它在手机上工作正常。

我不应该从自动对焦回调中拍照吗?这似乎是适当的地方。这里的任何见解都会很棒!

1 个答案:

答案 0 :(得分:3)

我想了一会儿,想让其他人知道如何解决这个问题。导致崩溃的原因是将预览大小设置为大于设备的屏幕大小。这就是为什么三星Galaxy S3会崩溃,而不是Nexus 4.以下是我改变的相关代码:

private Camera.Size getBestPreviewSize(List<Camera.Size> previewSizes, int width, int height) {
                double targetAspect = (double)width / (double)height;

        ArrayList<Camera.Size> matchedPreviewSizes = new ArrayList<Camera.Size>();
        final double ASPECT_TOLERANCE = 0.1;
        for(Size previewSize : previewSizes) {
                double previewAspect = (double)previewSize.width / (double)previewSize.height;

                // Original broken code.
                //if(Math.abs(targetAspect - previewAspect) < ASPECT_TOLERANCE) {
                //        matchedPreviewSizes.add(previewSize);
                //}

                // Working code.
                if(Math.abs(targetAspect - previewAspect) < ASPECT_TOLERANCE &&
                            previewSize.width <= width && previewSize.height <= height) {
                        matchedPreviewSizes.add(previewSize);
                }
        }

        Camera.Size bestPreviewSize;
        if(!matchedPreviewSizes.isEmpty()) {
                bestPreviewSize = Collections.max(matchedPreviewSizes, sizeComparator);
        } else {
                bestPreviewSize = Collections.max(previewSizes, sizeComparator);
        }

        return bestPreviewSize;
}

private Comparator<Camera.Size> sizeComparator = new Comparator<Camera.Size>() {

    @Override
    public int compare(Size lhs, Size rhs) {
        long lhsArea = lhs.height*lhs.width;
        long rhsArea = rhs.height*rhs.width;

        if(lhsArea > rhsArea) {
            return 1;
        } else if(lhsArea < rhsArea) {
            return -1;
        } else {
            return 0;
        }
    }

};

在上面的代码中,我展示了原始破坏的代码以及使我的功能符合设备最大屏幕尺寸的工作代码。这样做可以修复各种设备上发生的崩溃。

希望有所帮助!