Android怎么自定义Camera实现拍照小功能
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"Android怎么自定义Camera实现拍照小功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么自定义Camera实现拍照
千家信息网最后更新 2025年02月02日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); ListsupportedPictureSizes = 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(ListdeniedPermissions) { 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安全错误
数据库的锁怎样保障安全
贵港市app软件开发费用
数据库管理系统怎么建立表格
在jsp中如何连接数据库
汽修服务器
初中毕业软件开发学校
列车与线路数据存储服务器
流量卡网络安全吗
网络安全国旗下演讲图片
黑石互联网科技官网
山东有哪些靠谱的服务器提供商
软件开发流程混乱
饭堂自助点餐机软件开发
网络安全威胁情报指南
数据库备份c
2021年软考数据库技术三级
网络技术培训哪家好
网络安全要坚持
mac连接远程服务器
互联网金融发展的科技自立
入侵检测和网络安全论文
软件开发营业执照有什么要求
简称RA的数据库对应
装备强化的数据库
博兴物流竞价报价软件开发服务
数据库tcpip
阿里云服务器办理icp许可
水文数据库表结构设计
SQL数据库数据长度有隐藏
政府单位网络安全事例
同一数据库下安装多个实例