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>

更多相关文章

  1. Android安全机制(2) Android Permission权限控制机制
  2. 尽管在清单文件中指定了权限,但是ACCESS_FINE_LOCATION SecurityE
  3. Java访问权限控制简述

随机推荐

  1. PHP fopen/file_get_contents与curl性能
  2. php - tcp 粘包/拆包实例
  3. 10个PHP常见安全问题(实例讲解)
  4. Yii授权之基于角色的存取控制 (RBAC)
  5. python怎么添加环境变量
  6. PHP面试踩过的坑
  7. php响应Json字符串头部出现非法字符“\u
  8. 几个不常用但特别实用的PHP预定义变量
  9. php架构师主要是做什么的
  10. php实现对图片对称加解密(适用身份证加密