android开发中自定义拍照功能实现方法
程序员文章站
2022-07-06 11:10:27
android中的拍照有两种,一种是调用的拍照,一种是自定义的拍照。如果系统的拍照无法满足项目的需求,这个时候就需要用到自定义的拍照。android中给我们的自定义拍照提供了一些api,最主要用到的...
android中的拍照有两种,一种是调用的拍照,一种是自定义的拍照。如果系统的拍照无法满足项目的需求,这个时候就需要用到自定义的拍照。android中给我们的自定义拍照提供了一些api,最主要用到的就是surfaceview,首先就是在布局中指定根布局为surfaceview,然后在代码中findviewid()初始化,这些都很简单,接下来我把我写的主要代码给贴出来,如下:
//1 打开(照相机) mcamera = camera.open(0); //给surfaceview设置监听器 msurfaceview.getholder().addcallback(new surfaceholder.callback() { @override public void surfacecreated(surfaceholder holder) { //给照相机设置参数 camera.parameters parameters = mcamera.getparameters(); //设置每秒3栈 parameters.setpreviewframerate(3); //设置手机的预览方向 mcamera.setdisplayorientation(90); //设置照片的格式 parameters.setpreviewformat(pixelformat.jpeg); //设置照片的质量 parameters.set("jpeg-quality", 100); parameters.setfocusmode(camera.parameters.focus_mode_continuous_picture); // mcamera.setparameters(parameters);这个容易出错,不设置也行,主要用来设置拍照界面尺寸的 //将画面展示到surfaceview try { mcamera.setpreviewdisplay(holder); //开启预览 mcamera.startpreview(); } catch (ioexception e) { e.printstacktrace(); } } @override public void surfacechanged(surfaceholder holder, int format, int width, int height) { } @override public void surfacedestroyed(surfaceholder holder) { } });
基本上这样就可以打开拍照的页面了,但是也不要忘了释放一下:
@override public void onpause() { super.onpause(); if (mcamera != null) { mcamera.stoppreview(); mcamera.release(); } }
至于拍完照片需要存储也很简单,如下:
mcamera.takepicture(null, null, new camera.picturecallback() { private fileoutputstream mfos; @override public void onpicturetaken(byte[] data, camera camera) { bitmap bitmap = bitmapfactory.decodebytearray(data, 0, data.length); string path = environment.getexternalstoragepublicdirectory(environment.directory_dcim) + file.separator + "test"; file file = new file(path); if (!file.exists()) {//文件不存在就创建 file.mkdir(); } string picpath = file + file.separator + system.currenttimemillis() + ".jpg"; file pic = new file(picpath); try { mfos = new fileoutputstream(pic); //压缩 matrix matrix = new matrix(); //旋转90,拍完照的图片保存之后会自动旋转90度,在这里把图片给转回去去 matrix.postrotate(90); // 创建新的图片 bitmap resizedbitmap = bitmap.createbitmap(bitmap, 0, 0, bitmap.getwidth(), bitmap.getheight(), matrix, true); resizedbitmap.compress(bitmap.compressformat.jpeg, 85, mfos); tvphotofinish.setvisibility(view.visible); toastutil.showtoast(getcontext(), "拍照成功"); canshooting = true; camera.stoppreview(); camera.startpreview(); } catch (filenotfoundexception e) { e.printstacktrace(); } try { mfos.close(); } catch (ioexception e) { e.printstacktrace(); } } });
当然了,还要动态添加权限,这个有很多就不多说了,主要是以下这一个权限
代码上的注释已经很详细了,就不再做过多的说明了。
下一篇: 长大了随谁
推荐阅读
-
Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法
-
Android开发之ViewFlipper自动播放图片功能实现方法示例
-
Android开发实现AlertDialog中View的控件设置监听功能分析
-
Android开发自定义控件之折线图实现方法详解
-
Android开发中该如何通过划动屏幕实现图片切换功能
-
Android开发中APP中保持屏幕不自动灭屏实现方法
-
android开发中手动v2签名实现方法
-
Android开发——即时通讯中自定义聊天页面封装实现过程记录
-
android开发中自定义拍照功能实现方法
-
Android开发中实现View滑动的七种方法总结