多媒体拍照界面主要是用SurfaceView控件来显示照相机的画面 通过这个重写了3个方法
surfaceView.getHolder().addCallback()方法为:
surfaceDestroyed--->当预览界面关闭时,触发surfaceCreated----->预览界面被创建时,调用surfaceChanged----->当预览界面的格式和大小发生改变时,触发来看下界面:
<?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_main"android:layout_width="match_parent" android:layout_height="match_parent"><SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv_main_view" /><Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="takephoto" android:text="拍照" /></RelativeLayout>java代码:
//当预览界面被创建时 @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //打开照相机 camera = Camera.open(); //设置参数 Camera.Parameters parameters= camera.getParameters(); // 设置照片的输出格式 parameters.setPictureFormat(PixelFormat.JPEG); // 设置照片的质量 parameters.set("jpeg-quality",85); // 给照相机设置参数 camera.setParameters(parameters); try { //将摄像头的画面显示到SurfaceView控件上 camera.setPReviewDisplay(sv_main_view.getHolder()); //开始预览 camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } }//当预览界面关闭时 @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { // 关闭照相机 if (camera!=null){ camera.release(); camera.stopPreview(); camera=null; } }写了一个点击的方法:
public void takephoto(View view){ camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] bytes, Camera camera) { //实例化文件输出流 //写 //压缩(图片) //将字节数组转成bitmap //这样来写的话图片大小会很小,只不过图片的清晰度不是好 Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length); try { //图片的名字以及路径 FileOutputStream fos=new FileOutputStream("/mnt/sdcard/1/G150831_"+System.currentTimeMillis()+".png"); bitmap.compress(Bitmap.CompressFormat.PNG,85,fos); //重新拍照 camera.stopPreview(); camera.startPreview(); } catch (FileNotFoundException e) { e.printStackTrace(); } } }); }java代码如下:
sv_main_surface = (SurfaceView) findViewById(R.id.sv_main_surface); //实例化媒体录制器 mediaRecorder = new MediaRecorder();public void start(View view){ mediaRecorder.reset(); //设置参数 //设置音频,视频来源 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/1/G150831_"+System.currentTimeMillis()+".mp4"); //画面 mediaRecorder.setPreviewDisplay(sv_main_surface.getHolder().getSurface()); //准备 try { mediaRecorder.prepare(); mediaRecorder.start(); } catch (IOException e) { e.printStackTrace(); } } public void stop(View view){ //停止 mediaRecorder.stop(); }要加的权限有3个:
<!-- 打开照相机的权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!--SD卡权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--录音权限--> <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>新闻热点
疑难解答