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 - 无需预览即可拍照的主要内容,如果未能解决你的问题,请参考以下文章