您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android怎么自定義Camera實現(xiàn)拍照小功能”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Android怎么自定義Camera實現(xiàn)拍照小功能”文章能幫助大家解決問題。
首先實現(xiàn)一個自定義拍照功能。
自定義布局
<FrameLayout android:layout_below="@id/toolbar_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <SurfaceView android:id="@+id/surface" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"/> </FrameLayout>
初始化控件:
surfaceView = (SurfaceView) findViewById(R.id.surface); holder = surfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); btn.setOnCLickListener(new OnClickLister(View v){ if(mCamera == null){ mCamera = Camera.open(); } mCamera.takePicture(null,null,this); }); @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { initStartCamera(surfaceHolder); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { isAutoFocus = success; initCameraParams(); mCamera.cancelAutoFocus(); mCamera.startPreview(); } }); } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { // 當holder被回收時 釋放硬件 // releaseCamera(); } @Override protected void onPause() { super.onPause(); releaseCameraSource(); } @Override protected void onResume() { super.onResume(); // TODO: 看看退出到其他頁面是否有黑屏現(xiàn)象 if (surfaceView != null) { surfaceView.postDelayed(new Runnable() { @Override public void run() { initCameraParams(); } }, 50); } } private void initStartCamera(SurfaceHolder surfaceHolder) { try { mCamera = Camera.open(); mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } private void initCameraParams() { if (mCamera != null) { Camera.Parameters parameters = mCamera.getParameters(); parameters.setPictureFormat(ImageFormat.JPEG); parameters.setJpegQuality(90); List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes(); WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); Point point = new Point(); display.getSize(point); int screenWidth = point.x; int screenHeight = point.y; // 找到適合的圖片的尺寸 if (supportedPictureSizes != null && !supportedPictureSizes.isEmpty()) { int screenSize = screenHeight * screenWidth; Camera.Size picSize = null; for (Camera.Size size : supportedPictureSizes) { int value = size.height * size.width; if (value <= screenSize) { if (picSize == null) { picSize = size; } else { // 取最接近屏幕尺寸的 if (value > picSize.width * picSize.height) { picSize = size; } } } } if (picSize == null) { picSize = supportedPictureSizes.get(0); } parameters.setPictureSize(picSize.width, picSize.height); } // 設(shè)置對焦模式 List<String> supportedFocusModes = parameters.getSupportedFocusModes(); if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { // 快速對焦 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } else { parameters.setFocusMode(Camera.Parameters.FLASH_MODE_AUTO); } try { mCamera.setParameters(parameters); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } } private void releaseCameraSource() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } }
調(diào)用相機的拍攝功能:
點擊拍照調(diào)用camera.takePicture(null,null,this);
獲取拍照回調(diào)回來的圖片數(shù)據(jù)
public void onPictureTaken(final byte[] bytes,final Camera camera){ // 拍照回掉回來的 圖片數(shù)據(jù)。 final String filePath = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/"; final String picturePath = System.currentTimeMillis() + ".jpg"; final File file = new File(filePath, picturePath); new Thread(new Runnable() { @Override public void run() { Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); bitmap = rotateBitmapByDegree(bitmap, 90); BufferedOutputStream bos = null; try { //防止拍照保存圖片被壓縮 bos = new BufferedOutputStream(new FileOutputStream(file)); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); bos.flush(); bos.close(); bitmap.recycle(); Intent intent = new Intent(TakePhotoActivity.this,TPreViewPicActivity.class); intent.putExtra("filePath",filePath); intent.putExtra("picturePath",picturePath); startActivityForResult(intent,102); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } }).start(); }
接下來要說的就是我們上面說到的保存圖片被旋轉(zhuǎn)的問題:
public Bitmap rotateBitmapByDegree(Bitmap bm,int degree){ Bitmap bitmap ; Matrix matrix = new Matrix(); matrix.postRotate(degree); try{ bitmap = Bitmap.createBitmap(bm,0,bm.getWidth,bm.getHeight,matrix,true); }catch(OutOfMemoryError e){ e.printStackTrace(); } if(bitmap == null){ bitmap = bm; } if(bm != bitmap){ bm.recycle(); } return bitmap; } @Override public void onPause(){ super.onPause(); if(camera != null){ if(isPrevew){ camera.stopPreview(); camera.release(); camera= null; isPreView= false; } } } @Override protected void onResume() { super.onResume(); openCamera(); }
*#額外要說明的是,android 6.0權(quán)限問題,可能會導(dǎo)致首次進入拍照界面黑屏,解決方案在拍照界面之前請求權(quán)限;
最后附上請求權(quán)限代碼:
public void checkPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.CAMERA} , new TCallPhoneTool.PermissionListener() { @Override public void onGranted() { // openCamera(); } @Override public void onRefused(List<String> deniedPermissions) { showMissingPermissionDialog(); } }); } else { // openCamera(); } } TCallPhoneTool.PermissionListener mListener ; final int REQUEST_CODE_STORAGE = 131; public void requestPermissions(String[] permissions, TCallPhoneTool.PermissionListener listener) { List<String> deniedPermissions = new ArrayList<>() ; mListener = listener ; for (String permission : permissions) { if (ContextCompat.checkSelfPermission(this,permission) == PackageManager.PERMISSION_DENIED) { deniedPermissions.add(permission); } } if (deniedPermissions.size() > 0) { ActivityCompat.requestPermissions(this,deniedPermissions.toArray(new String[deniedPermissions.size()]),REQUEST_CODE_STORAGE); } else { mListener.onGranted(); } } public void showMissingPermissionDialog() { android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this); builder.setTitle(getString(com.to8to.baselib.R.string.tip_permision_miss)); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); builder.setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startAppSetting(); } }); builder.setCancelable(false); builder.show(); public void startAppSetting() { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + this.getPackageName())); startActivity(intent); }
關(guān)于“Android怎么自定義Camera實現(xiàn)拍照小功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。