您的位置:首页 > 移动开发 > Android开发

android 自定义相机

2016-01-05 18:58 423 查看
[code]/**
 * 在Activity 和 SurfaceView的声明周期方法里, 管理相机的生命周期
 * 在点击事件之中,设置拍照的参数,然后在回调方法里面获取到拍照之后的路径
 */
 public class CamaraSurfaceView extends Activity implements Callback, OnClickListener {

    private Camera camera;
    private SurfaceView surface;
    private SurfaceHolder mHolder;

    //相机拍照之后的回调
    private PictureCallback TakeCallBack=new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {

            //将拍照的数据写入到文件中
            String path=Environment.getExternalStorageDirectory()+"/"+System.currentTimeMillis()+".jpg";
            File tempFile=new File(path);
            FileOutputStream fos=null;

            try {
                if(!tempFile.exists()){
                      tempFile.createNewFile();             
                }
                fos=new FileOutputStream(tempFile);
                fos.write(arg0);
                fos.flush();

                Intent intent=new Intent(CamaraSurfaceView.this,MainActivity.class);
                intent.putExtra("path",tempFile.getAbsolutePath());
                setResult(MainActivity.REQUEST_CAPTURE, intent);
                CamaraSurfaceView.this.finish();

            } catch (Exception e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO 自动生成的方法存根
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.camaralayout);
        surface=(SurfaceView) this.findViewById(R.id.surface);
        mHolder=surface.getHolder();
        mHolder.addCallback(this);

        this.findViewById(R.id.cap).setOnClickListener(this);
    }

    /**
     * 准备相机
     */
    @Override
    protected void onResume() {
        // TODO 自动生成的方法存根
        super.onResume();

        if(camera==null ){
            camera=getCamera();
            //绑定相机与显示界面
            preViewCamera(camera,mHolder);
        }
    }

    /**
     * 释放相机资源
     */
    @Override
    protected void onPause() {
        // TODO 自动生成的方法存根
        super.onPause();
        releaseCamera(camera);
    }

    /**
     * 获取相机资源
     * @return
     */
    public Camera getCamera(){
        Camera camera=null;
        try {
            camera=Camera.open();
        } catch (Exception e) {
            camera=null;
        }
        return camera;
    }

    /**
     * 释放相机资源
     * @param camera
     */
    public void releaseCamera(Camera camera){
        if(camera!=null){
            camera.release();
            camera=null;
        }
    }

    /**
     * 将相机与展示界面绑定
     * @param camera
     * @param mHolder
     */
    public void preViewCamera(Camera camera,SurfaceHolder mHolder){

        try {
             if(camera!=null && mHolder!=null){
                camera.setPreviewDisplay(mHolder);
                //将相机切换到竖屏显示
                 camera.setDisplayOrientation(90);
                 camera.startPreview();
             }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
         if(camera!=null){
             camera.stopPreview();
             preViewCamera(camera,mHolder);
         }
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        preViewCamera(camera,mHolder);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO 自动生成的方法存根
        releaseCamera(camera);
    }

    @Override
    public void onClick(View arg0) {
        switch(arg0.getId()){
        case R.id.cap:
            //设置相机的参数
            if(camera!=null){
                Parameters params=camera.getParameters();
                //设置拍照的格式
                params.setPictureFormat(ImageFormat.JPEG);
                params.setPreviewSize(800, 400);
                //设置相机对焦的模式
                params.setFlashMode(Camera.Parameters.FOCUS_MODE_AUTO);
               //相机对焦完成之后
                camera.autoFocus(new AutoFocusCallback() {

                    @Override
                    public void onAutoFocus(boolean success, Camera arg1) {

                        if(success){
                            camera.takePicture(null, null, TakeCallBack);
                        }
                    }
                });
            }
            break;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: