Android SurfaceView拍照录像实现方法
程序员文章站
2023-12-20 19:49:46
surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。
话不多说,直接上代码
布局文件
surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。
话不多说,直接上代码
布局文件
<surfaceview android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv_main_surface" /> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="tackphoto" android:text="拍照" />
activity
public class mainactivity extends appcompatactivity { private surfaceview sv_main_surface; private camera camera; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); sv_main_surface = (surfaceview) findviewbyid(r.id.sv_main_surface); //添加surface回调函数 sv_main_surface.getholder().addcallback(new surfaceholder.callback() { @override//控件创建时,打开照相机 public void surfacecreated(surfaceholder holder) { //打开照相机 camera = camera.open(); //设置参数 camera.parameters parameters=camera.getparameters(); parameters.setpictureformat(pixelformat.jpeg); parameters.set("jpeg-quality",85); camera.setparameters(parameters); //将画面展示到surfaceview try { camera.setpreviewdisplay(sv_main_surface.getholder()); } catch (ioexception e) { e.printstacktrace(); } //开启预览效果 camera.startpreview(); } @override//控件改变 public void surfacechanged(surfaceholder holder, int format, int width, int height) { } @override//控件销毁 public void surfacedestroyed(surfaceholder holder) { //照相同一时刻只能允许一个软件打开 if(camera!=null){ camera.stoppreview(); camera.release();//释放内存 camera=null; } } }); } public void takephoto(view view){ camera.takepicture(null, null, new camera.picturecallback() { @override public void onpicturetaken(byte[] bytes, camera camera) { //技术:图片压缩技术(如果图片不压缩,图片大小会过大,会报一个oom内存溢出的错误) bitmap bitmap= bitmapfactory.decodebytearray(bytes,0,bytes.length); try { fileoutputstream fos = new fileoutputstream("/mnt/sdcard/qq"+system.currenttimemillis()+".png");//图片保存路径 bitmap.compress(bitmap.compressformat.png,85,fos);//压缩格式,质量,压缩路径 camera.stoppreview(); camera.startpreview(); } catch (filenotfoundexception e) { e.printstacktrace(); } } }); } }
我们还要添加权限
<!--打开照相机的权限--> <uses-permission android:name="android.permission.camera"></uses-permission> <!--创建文件的权限--> <uses-permission android:name="android.permission.mount_unmount_filesystems"></uses-permission> <!--写内存卡的权限--> <uses-permission android:name="android.permission.write_external_storage"></uses-permission>
就这样一个小案例就完成了
既然可以拍照,那肯定也是可以录像的,所以我们再来看看录像是怎么实现的
布局文件
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_media_recorder" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context="com.zking.familyapp.mediarecorderactivity"> <surfaceview android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv_media_surface" /> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" ></linearlayout> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" android:onclick="start" /> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" android:onclick="stop" /> </relativelayout>
activity
public class mediarecorderactivity extends appcompatactivity { private surfaceview sv_media_surface; private mediarecorder mediarecorder; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_media_recorder); sv_media_surface = (surfaceview) findviewbyid(r.id.sv_media_surface); //实例化媒体录制器 mediarecorder = new mediarecorder(); } public void start(view view){ mediarecorder.setvideosource(mediarecorder.videosource.camera); mediarecorder.setaudiosource(mediarecorder.audiosource.mic); //设置格式 mediarecorder.setoutputformat(mediarecorder.outputformat.mpeg_4); mediarecorder.setvideoencoder(mediarecorder.videoencoder.h263); mediarecorder.setaudioencoder(mediarecorder.audioencoder.amr_nb); //设置保存路径 mediarecorder.setoutputfile("/mnt/sdcard/uu"+system.currenttimemillis()+".mp4"); mediarecorder.setpreviewdisplay(sv_media_surface.getholder().getsurface()); try { mediarecorder.prepare(); mediarecorder.start(); } catch (ioexception e) { e.printstacktrace(); } } public void stop(view view){ if(mediarecorder!=null){ mediarecorder.stop(); mediarecorder.release(); mediarecorder=null; } } }
添加权限
<!-- 录像的权限--> <uses-permission android:name="android.permission.record_audio"></uses-permission>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。