昨天在網上找了好久SurfaceView截屏方法,canvas轉bitmap方法...... 發現國內網站上太多坑了!!!Google上也有一些,沒有在Google上找到合適的方法,多是我找到後面煩躁了吧,Google上的沒有仔細看.java
這篇不解決canvas轉bitmap的的問題,不解決SurfaceView截屏的問題,解決的是相機預覽時獲取Bitmap,用的可不是takePicture方法canvas
還有就是由於我的代碼存在的問題,致使PreviewCallback沒有被調用,文末給出瞭解決辦法.數組
我用的方法是經過ide
Camera.setPreviewCallback(mPreviewCallback);
而後在Camera.PreviewCallback類自動實現的網站
public void onPreviewFrame(byte[] data, Camera camera)
方法中獲取data,構成Bitmap.spa
給出我在代碼中的previewCallback,生成Bitmap的過程不必定要以下方法寫.其餘方法本身去試吧.net
private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Size localSize = camera.getParameters().getPreviewSize(); //得到預覽分辨率 YuvImage localYuvImage = new YuvImage(data, 17, localSize.width, localSize.height, null); ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream(); //把攝像頭回調數據轉成YUV,再按圖像尺寸壓縮成JPEG,從輸出流中轉成數組 localYuvImage.compressToJpeg(new Rect(0, 0, localSize.width, localSize.height), 80, localByteArrayOutputStream); mParamArrayOfByte = localByteArrayOutputStream.toByteArray(); //生成Bitmap BitmapFactory.Options localOptions = new BitmapFactory.Options(); localOptions.inPreferredConfig = Bitmap.Config.RGB_565; //構造位圖生成的參數,必須爲565。類名+enum mCurrentBitmap = BitmapFactory.decodeByteArray(mParamArrayOfByte, 0, mParamArrayOfByte.length, localOptions); } };
注意,不須要錄製視頻,因此不調用Camera.unlock(),以前由於調用了這個方法,致使PreviewCallback沒有被調用.迷途很久! code