Welcome

首页 / 移动开发 / Android / Android SurfaceView拍照录像实现方法

Surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。

话不多说,直接上代码
布局文件
<SurfaceViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/sv_main_surface"/><Buttonandroid: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;@Overridepublic 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);//将画面展示到SurfaceViewtry {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() {@Overridepublic 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"><SurfaceViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/sv_media_surface"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"></LinearLayout><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始"android:onClick="start"/> <Buttonandroid: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;@Overrideprotected 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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。