2

我正在尝试制作可以连续拍摄 3 张照片的相机应用程序。

我试图通过将它放在一个循环中来多次调用“takePicture”。

但没有成功。

请帮助解决这个问题。

一点帮助将不胜感激。

4

3 回答 3

3

你永远不应该PictureCallback.onPictureTaken()从你的代码中调用;此回调在准备好时从系统接收数据,作为对 的响应Camera.takePicture()

仅当打开相机并开始预览时,后一个调用才会成功。因此,简单地Camera.takePicture()在循环中调用是行不通的(参见例如Android 2.3.1 Camera takePicture() Multiple images with one button click)。处理此问题的正确方法是在您onPictureTaken()Camera.takePicture(). 在此之后,onPictureTaken()应该return允许处理下一个捕获的帧。

于 2013-10-22T11:07:46.310 回答
0

我得到了解决方案。

我在循环中调用mCamera.startPreview();

预览是必须要拍的,不包括mCamera.startPreview();被挡住我的执行。

于 2013-10-23T05:06:40.170 回答
0

我在做 PhotoBurst 时就这样使用它。它还处理 FRameLayout 保存预览以启动 PhotoBurst:

PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        FileOutputStream outStream = null;
        try {

            Parameters param = camera.getParameters();
            param.setPictureSize(640, 480);
            camera.setParameters(param);

             // Or write to sdcard
            outStream = new FileOutputStream(String.format(
                    Environment.getExternalStorageDirectory().getPath()+"/foto%d.jpg",
                    System.currentTimeMillis()));

            outStream.write(data);
            outStream.close();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,                           
                     Uri.fromFile(Environment.getExternalStorageDirectory())));

            Log.i(TAG, "onPictureTaken - wrote bytes: " + data.length);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        Log.d(TAG, "onPictureTaken - jpg");
        try {
            stillCount++;
            camera.startPreview();
            if (stillCount < 10) {
                preview.mCamera.takePicture(shutterCallback, rawCallback,
                        jpegCallback);
                if (stillCount == 9) {
                    frameLayout.setClickable(true);
                }
            } else {
                stillCount = 0;
                takePictureButton.setEnabled(true);
                frameLayout.setClickable(true);
            }
        } catch (Exception e) {
            Log.d(TAG, "Error starting preview: " + e.toString());
        }
    }
};  
于 2013-10-22T12:38:41.503 回答