【问题标题】:Android - Take picture without previewAndroid - 无需预览即可拍照
【发布时间】:2014-11-03 11:07:33
【问题描述】:

我正在尝试在没有预览的情况下拍照,当我的应用程序开始运行时,然后将图片保存在根文件夹中的新文件夹“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" />

【问题讨论】:

标签: android android-camera surfaceview


【解决方案1】:

您无法在没有预览的情况下拍照,但您不必在屏幕上显示预览。您可以改为将输出定向到 SurfaceTexture (API 11+)。

更多详情请见this answer

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 使用camera.setPreviewDisplay(null),没有任何延迟会有所帮助(嗯,存在一些允许此类 ricks 的设备)。另请注意,delay 不能是简单的Sleep() 调用。相机初始化流程涉及一些回调,需要及时响应。例如。在SurfaceView 在其侦听器上调用SurfaceCreated() 之前,不能使用 SurfaceHolder。
    【解决方案3】:

    没有预览是不可能拍照的。您应该阅读 Android 在线参考:http://developer.android.com/reference/android/hardware/Camera.html#takePicture

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

    【讨论】:

    • 你确定没有预览就不能拍照吗?我知道这样做的应用程序 - “gotya!”。如果有人尝试使用错误密码解锁设备,此应用会拍照。
    • 我认为它只是隐藏了预览。例如,您可以在 SurfaceView 上添加自定义视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多