美文网首页基础Android知识Android开发
自己写一个Android照相机应用(2)

自己写一个Android照相机应用(2)

作者: 昔日风 | 来源:发表于2017-02-26 12:52 被阅读328次

自定义相机

上一篇讲的是调用系统相机拍照然后显示在屏幕上,自定义一个相机就是自己相机的activity。
1,首先是要创建camera的生命周期

getCamera();//获取Camera对象
setStartPreview(Camera camera,SurfaceHolder holder);//预览相机内容
releaseCamera();//释放相机资源

2,activity生命周期与camera绑定

    protected void onResume() {
        super.onResume();
        if (mCamera == null) {
            mCamera = getCamera();
            if (mHolder != null) {
                setStartPreview(mCamera,mHolder);
            }
        }
    }
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

3,camera与surfaceview绑定

    //预览图像与camera绑定
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        setStartPreview(mCamera,mHolder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mCamera.stopPreview();
        setStartPreview(mCamera,mHolder);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }

4,声明相机使用权限

<uses-permission android:name="android.permission.CAMERA"</uses-permission>

5,实现照相,通过回调将照片数据保存到文件,并将文件路径传递到其它activity(ResultAty);

    private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {//data中存储照片的全部信息
            File tempFile = new File("/sdacrd/temp.png");
            try {
                FileOutputStream fos = new FileOutputStream(tempFile);
                fos.write(data);
                fos.close();
                Intent intent = new Intent(CustomCamera.this,ResultAty.class);
                intent.putExtra("picPath",tempFile.getAbsolutePath());
                startActivity(intent);
                CustomCamera.this.finish();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    public void capture(View view){
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPictureFormat(ImageFormat.JPEG);//设置拍照格式jpg格式
        parameters.setPictureSize(800,400);//设置照片大小
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦
        mCamera.autoFocus(new Camera.AutoFocusCallback() {  //回调,对焦最清晰时拍照
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if (success) {
                    mCamera.takePicture(null,null,mPictureCallback);
                }
            }
        });

    }

创建CustomCamera类实现拍照功能(全部代码)

import android.app.Activity;
import android.hardware.Camera;
//导入android.hardware.Camera而不是android.graphics.Camera
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import java.io.IOException;

/**
 * Created by 方 on 2017/2/24.
 */
public class CustomCamera extends Activity implements SurfaceHolder.Callback{


    private Camera mCamera;
    private SurfaceView mPreview;
    private SurfaceHolder mHolder;
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {//data中存储照片的全部信息
            File tempFile = new File("/sdacrd/temp.png");
            try {
                FileOutputStream fos = new FileOutputStream(tempFile);
                fos.write(data);
                fos.close();
                Intent intent = new Intent(CustomCamera.this,ResultAty.class);
                intent.putExtra("picPath",tempFile.getAbsolutePath());
                startActivity(intent);
                CustomCamera.this.finish();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom);
        mPreview = (SurfaceView) findViewById(R.id.preview);
        mHolder = mPreview.getHolder();
        mHolder.addCallback(this);
    }
    
    //Camera生命周期与Activity生命周期绑定
    @Override
    protected void onResume() {
        super.onResume();
        if (mCamera == null) {
            mCamera = getCamera();
            if (mHolder != null) {
                setStartPreview(mCamera,mHolder);
            }
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

    //Button事件实现照相,通过回调将照片数据保存到文件,并将文件路径传递到其它activity;
    public void capture(View view){
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPictureFormat(ImageFormat.JPEG);//设置拍照格式jpg格式
        parameters.setPictureSize(800,400);//设置照片大小
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦
        mCamera.autoFocus(new Camera.AutoFocusCallback() {  //回调,对焦最清晰时拍照
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if (success) {
                    mCamera.takePicture(null,null,mPictureCallback);
                }
            }
        });

    }

    //获取Camera对象
    private Camera getCamera(){
        Camera camera = null;
        try {
            camera = Camera.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return camera;
    }

    //开始预览相机内容
    private void setStartPreview(Camera camera,SurfaceHolder holder){
        try {
            camera.setPreviewDisplay(holder);
            //旋转90度
            camera.setDisplayOrientation(90);
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //释放相机资源
    private void releaseCamera(){
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }


    }

    //预览图像与camera绑定
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        setStartPreview(mCamera,mHolder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mCamera.stopPreview();
        setStartPreview(mCamera,mHolder);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }
}

原文地址:http://vhcffh.com/archives/237.html

相关文章

网友评论

    本文标题:自己写一个Android照相机应用(2)

    本文链接:https://www.haomeiwen.com/subject/jqpowttx.html