Android Camera實現(xiàn)毫秒級拍照實例
我們知道自定義Camera需要以下幾步
- 打開相機(jī),即實例化Camera對象,Camera camera = Camera.open();
- 設(shè)置Camera的相關(guān)參數(shù),Camera.Parameters parameters = camera.getParameters();
- 打開預(yù)覽,camera.setPreviewDisplay(surfaceholder); camera.startPreview();
- 獲取圖片,這里只是從預(yù)覽中獲取因此使用,camera.setPreviewCallback(new Camera.PreviewCallback(){……..});
- 停止預(yù)覽,釋放相機(jī),camera.stopPreview();camera.release();
1、打開相機(jī)
public static Camera openFacingBackCamera() { Camera cam = null; Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); for (int camIdx = 0, cameraCount = Camera.getNumberOfCameras(); camIdx < cameraCount; camIdx++) { Camera.getCameraInfo(camIdx, cameraInfo); if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { try { //打開相應(yīng)的攝像頭,目前是前置攝像頭 cam = Camera.open(camIdx); } catch (RuntimeException e) { e.printStackTrace(); if (cam!=null){ cam.stopPreview(); cam.release(); } cam = null; } } } return cam; }
2、設(shè)置相關(guān)參數(shù)和預(yù)覽
//定義SurfaceView private SurfaceView localSurface; // 為surfaceHolder添加一個回調(diào)監(jiān)聽器 localSurface.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { camera = CameraUtil.openFacingBackCamera(); //設(shè)置相機(jī)預(yù)覽旋轉(zhuǎn)角度 camera.setDisplayOrientation(180); if (camera != null) { Camera.Parameters parameters = camera.getParameters();// 獲得相機(jī)參數(shù) List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); List<Camera.Size> sizes_pic = parameters.getSupportedPictureSizes(); Camera.Size cs = sizes.get(0); int mWidth = cs.width; int mHeight = cs.height; parameters.setPreviewSize(mWidth, mHeight); parameters.setPictureSize(sizes_pic.get(0).width, sizes_pic.get(0).height); parameters.setJpegQuality(85);// parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); parameters.setPictureFormat(ImageFormat.JPEG); camera.setParameters(parameters); try { camera.setPreviewDisplay(localSurface.getHolder()); camera.startPreview(); // 開始預(yù)覽 camera.autoFocus(null); // 自動對焦 } catch (IOException e) { e.printStackTrace(); camera.stopPreview(); camera.release(); camera = null; } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera!=null){ camera.stopPreview(); camera.release(); camera = null; } } } ); // 設(shè)置該SurfaceView自己不維護(hù)緩沖 localSurface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
3、獲取圖片
private void getViewImage() { //設(shè)置監(jiān)聽 camera.setPreviewCallback(new Camera.PreviewCallback(){ @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Size size = camera.getParameters().getPreviewSize(); try{ YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if(image!=null){ ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream); Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()); //因為圖片會放生旋轉(zhuǎn),因此要對圖片進(jìn)行旋轉(zhuǎn)到和手機(jī)在一個方向上 rotateBitmap(bmp); stream.close(); } }catch(Exception ex){ Log.e("Sys","Error:"+ex.getMessage()); } } }); }
旋轉(zhuǎn)圖片的方法
public void rotateMyBitmap(Bitmap bmp){ Matrix matrix = new Matrix(); matrix.postScale(-1, 1); // 鏡像水平翻轉(zhuǎn)(如果左右顛倒) matrix.postRotate(180); Bitmap nbmp = Bitmap.createBitmap(bmp, 0,0, bmp.getWidth(), bmp.getHeight(), matrix, true); imageView.setImageBitmap(nbmp); };
自定義時間拍照
private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 101: getViewImage(); Log.e(TAG, "handleMessage: 拍照" ); mHandler.sendEmptyMessageDelayed(102, 100); break; case 102: camera.setPreviewCallback(null); break ; } } };
然后點擊按鈕調(diào)用
mHandler.sendEmptyMessageDelayed(101, 100);
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android自定義Camera實現(xiàn)錄像和拍照
- Android自定義Camera實現(xiàn)拍照功能
- Android實現(xiàn)Camera2預(yù)覽和拍照效果
- android自定義Camera拍照并查看圖片
- Android中使用Camera類編寫手機(jī)拍照App的實例教程
- android系統(tǒng)在靜音模式下關(guān)閉camera拍照聲音的方法
- Android實現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android啟動相機(jī)拍照并返回圖片
- Android拍照保存在系統(tǒng)相冊不顯示的問題解決方法
- Android自定義Camera實現(xiàn)拍照小功能
相關(guān)文章
Android中imageView圖片放大縮小及旋轉(zhuǎn)功能示例代碼
這篇文章主要介紹了Android中imageView圖片放大縮小及旋轉(zhuǎn)功能示例代碼,需要的朋友可以參考下2017-08-08Android解析服務(wù)器端發(fā)來的xml數(shù)據(jù)示例
Android跟服務(wù)器交互數(shù)據(jù),有時數(shù)據(jù)量大時,就需要以xml形式的交互數(shù)據(jù),下面與大家分享下使用XmlPullParser來解析xml數(shù)據(jù),感興趣的朋友可以參考下哈2013-06-06Android開發(fā)自學(xué)筆記(二):工程文件剖析
這篇文章主要介紹了Android開發(fā)自學(xué)筆記(二):工程文件剖析,本文講解了AndroidManifest.xml、src文件夾、res文件夾等文件的作用,需要的朋友可以參考下2015-04-04Android自定義view實現(xiàn)圓的擴(kuò)散效果
這篇文章主要為大家詳細(xì)介紹了Android自定義view實現(xiàn)圓的擴(kuò)散效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01android12?SD如何動態(tài)申請讀寫權(quán)限
這篇文章主要給大家介紹了關(guān)于android12?SD如何動態(tài)申請讀寫權(quán)限的相關(guān)資料,從Android?6.0開始,權(quán)限不再是在manifest?件中粘貼?下即可,這時候權(quán)限也正式?進(jìn)?家的視野,需要的朋友可以參考下2023-07-07Android調(diào)用系統(tǒng)自帶的分享功能實例代碼
本篇文章主要介紹了Android調(diào)用系統(tǒng)自帶的分享功能實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04Android實現(xiàn)調(diào)用攝像頭拍照并存儲照片
本文主要介紹了如何利用Android調(diào)用攝像頭拍照,并顯示拍照后的圖片到ImageView中,文中的示例代碼講解詳細(xì),感興趣的可以動手試一試2022-01-01