Android - 无需预览即可拍照

Posted

技术标签:

【中文标题】Android - 无需预览即可拍照【英文标题】:Android - Take picture without preview 【发布时间】: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" />

【问题讨论】:

How to take pictures from the camera without preview when my app starts?的可能重复 【参考方案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 上添加自定义视图。

以上是关于Android - 无需预览即可拍照的主要内容,如果未能解决你的问题,请参考以下文章

拍照不预览 Android

拍照不预览 Android

android camera能不预览就拍照吗

Android 相机预览在预览中拉伸,而不是在拍照后

SurfaceView实现拍照预览

Android 使用CameraX拍照预览