Android怎么自定义Camera实现拍照小功能
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,这篇文章主要介绍"Android怎么自定义Camera实现拍照小功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么自定义Camera实现拍照
千家信息网最后更新 2025年11月06日Android怎么自定义Camera实现拍照小功能
这篇文章主要介绍"Android怎么自定义Camera实现拍照小功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么自定义Camera实现拍照小功能"文章能帮助大家解决问题。
首先实现一个自定义拍照功能。
自定义布局
初始化控件:
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);}); @Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) { initStartCamera(surfaceHolder);}@Overridepublic 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: 看看退出到其他页面是否有黑屏现象 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 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); } // 设置对焦模式 List 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; } } 调用相机的拍摄功能:
点击拍照调用camera.takePicture(null,null,this);
获取拍照回调回来的图片数据
public void onPictureTaken(final byte[] bytes,final Camera camera){ // 拍照回掉回来的 图片数据。 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();}接下来要说的就是我们上面说到的保存图片被旋转的问题:
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;}@Overridepublic 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权限问题,可能会导致首次进入拍照界面黑屏,解决方案在拍照界面之前请求权限;
最后附上请求权限代码:
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 deniedPermissions) { showMissingPermissionDialog(); } }); } else {// openCamera(); } } TCallPhoneTool.PermissionListener mListener ; final int REQUEST_CODE_STORAGE = 131; public void requestPermissions(String[] permissions, TCallPhoneTool.PermissionListener listener) { List 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("设置", 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); } 关于"Android怎么自定义Camera实现拍照小功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
功能
图片
权限
知识
问题
数据
界面
行业
不同
实用
接下来
代码
内容
实用性
实际
就是
尺寸
布局
控件
文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
multisim数据库怎么设置
广东省网络安全
绍兴瑞丰银行 软件开发
erp软件开发哪家便宜
兴城天气预报软件开发
数据库乐观锁 场景
银行软件开发要非科班硕士吗
dell服务器主板双cpu
数据库表单控件设计
瑞文视频软件开发
锐捷网络安全设备管理
适用视频点播的网络技术是
网络安全助孩子健康成长
网络安全创新大会f5重磅亮相
数据库发生冲突自动保存文件
软件开发建设需求跟业务需求
网络安全老师答案
刀片服务器组成
ecs加载数据库
文本文字在数据库当中用什么类型
网络安全宣传手抄报模板
福建服务器公司有哪些服务器
小爱优选软件开发案例
华硕飞行堡做软件开发
现在还用得着监控服务器吗
数据库必备
华为云服务器密码多次输入错误
国产电脑系统软件开发
国家地理信息数据库碳排放
工控软件开发步骤