Android - 无预览拍照

时间:2014-09-09 22:34:20

标签: android android-camera surfaceview

我正在尝试在没有预览的情况下拍照,当我的应用程序开始运行时,然后将图片保存在新文件夹中 - " pictures123",在根文件夹中。 有人可以告诉我我的代码中有什么问题吗?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    File directory = new File(Environment.getExternalStorageDirectory() + "/pictures123/");

    if (!directory.exists()) {
        directory.mkdir();
    }

    Camera camera = Camera.open(0);
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPictureFormat(ImageFormat.JPEG);
    camera.setParameters(parameters);
    SurfaceView mview = new SurfaceView(getBaseContext());
    camera.setPreviewDisplay(mview.getHolder());
    camera.setPreviewDisplay(null);
    camera.startPreview();
    camera.takePicture(null,null,photoCallback);
    camera.stopPreview();
}

Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {

        try {
            String root = Environment.getExternalStorageDirectory().toString();
            File myDir = new File(root + "/pictures123");
            File file = new File (myDir, "pic1.jpeg");
            FileOutputStream out = new FileOutputStream(file);
            out.write(data);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();

        } catch (Exception e)
        {
            e.printStackTrace();
        }
        finish();

    }
};

权限:

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

4 个答案:

答案 0 :(得分:8)

如果没有预览,您无法拍摄照片,但无需在屏幕上显示预览。您可以将输出定向到SurfaceTexture(API 11 +)。

有关详细信息,请参阅this answer

答案 1 :(得分:0)

我认为主要问题是你在startPreview之后立即调用takePicture,这实际上需要时间来完成它的设置。因此,在这两者之间添加延迟可以暂时解决此问题,look here for more details

答案 2 :(得分:0)

没有预览就无法拍照。您应该阅读Android在线参考:http://developer.android.com/reference/android/hardware/Camera.html#takePicture

注意: 此方法仅在预览处于活动状态时(startPreview()之后)有效。拍摄图像后将停止预览;如果呼叫者想要重新开始预览或拍摄更多照片,则必须再次调用startPreview()。不应在start()和stop()之间调用它。

答案 3 :(得分:0)

如果您使用的是 Camera 2 API ,则无需预览或午餐设备的相机应用即可秘密拍照,您可以在github上检查我的项目。

https://github.com/botyourbusiness/android-camera2-secret-picture-taker

希望有帮助:)

相关问题