这是由于手机拍照有声音是国际标准,就是为了防止偷pai,正规的Android发布厂商都会有。
换一种思路,相机除了拍照还有录像和预览的功能,拍照和录像都是无可避免有声音的,而通过相机预览是没有声音的。
所以需要研究一下预览模式下,能不能获取当前的图像。通过研究Camera类,发现真的有一个Camera.PreviewCallback的子类。
通过Camera.setPreviewCallback(previewCallback)方法,在相机预览的过程中,
每一帧都会回调到 onPreviewFrame(byte[] data, Camera paramCamera)中,代码如下:
private PreviewCallback previewCallback = new PreviewCallback(){ @Override public void onPreviewFrame(byte[] data, Camera paramCamera){ Log.i(TAG, "onPreviewFrame"); try { YuvImage yuvimage = new YuvImage( data, ImageFormat.NV21, paramCamera.getParameters().getPreviewSize().width, paramCamera.getParameters().getPreviewSize().height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg( new Rect(0,0,paramCamera.getParameters().getPreviewSize().width, paramCamera.getParameters().getPreviewSize().height), 80, baos); FileOutputStream outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", 11111)); outStream.write(baos.toByteArray()); outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } camera.stopPreview(); camera.setPreviewCallback(null); } };
当然,每一帧回调,都会有帧数据,这些帧数据就需要自己来编码并存储了。
data字节流默认是YCbCr_420_SP,2.2之前的并没有把这种数据转化的方法,
SDK2.2之后,提供了一个YuvImage的类来转成图片。
这样,在需要拍照的时候,取一帧数据就可以了,并没有真正的调用拍照的API,就实现了无声拍照。