android开发中自定义拍照功能实现方法
程序员文章站
2022-03-23 19:41:38
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开发中多点触摸的实现方法
-
解析在Android中为TextView增加自定义HTML标签的实现方法
-
Android编程实现自定义ImageView圆图功能的方法
-
Android开发实现图片平移、缩放、倒影及旋转功能的方法
-
Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享
-
Android开发实现拍照功能的方法实例解析
-
Android开发实现自定义新闻加载页面功能实例
-
Android开发使用自定义view实现ListView下拉的视差特效功能
-
Android开发中自定义ProgressBar控件的方法示例
-
android中关于call拨号功能的实现方法