andorid 简单的自定义相机

android 自定义相机

1.学习 自定义相机 所用到的类 硬件类android.hardware.Camera 。
2.预览类 android.view.SurfaceView 预览辅助类 android.view.SurfaceHolder。

注意事项

  1. Camera 的执行顺序 流程控制 配合activity 生命周期 调控摄像机2.Camera 属性设置 主要是 预览大小设置 和 图片大小设置。
    3.将持续优化…^-^。

代码部分

1.首先是activity 类

package org.zhx.view.camera.ui;

import java.io.IOException;
import org.zhx.view.R;
import org.zhx.view.camera.util.DisplayUtil;

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Point;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

/**
 * 
 * 希望有一天可以开源出来 org.zhx
 * 
 * @version 1.0, 2015-11-15 下午5:22:17
 * @author zhx
 */
public class ZCameraBaseAcitivy extends Activity implements PictureCallback,
        Callback, OnClickListener {
    private static final String TAG = ZCameraBaseAcitivy.class.getSimpleName();

    public static BitmapFactory.Options opt;
    static {
        // 缩小原图片大小
        opt = new BitmapFactory.Options();
        opt.inSampleSize = 2;
    }

    private SurfaceView mPreView;
    private SurfaceHolder mHolder;

    private Camera mCamera;
    private boolean isPreview = false;
    private Point displayPx;
    private ImageView tpImg, showImg;
    private Button saveBtn;

    protected void onCreate(android.os.Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.zcamera_base_layout);

        displayPx = DisplayUtil.getScreenMetrics(this);
        mPreView = (SurfaceView) findViewById(R.id.z_base_camera_preview);
        tpImg = (ImageView) findViewById(R.id.z_take_pictrue_img);
        saveBtn = (Button) findViewById(R.id.z_base_camera_save);
        showImg = (ImageView) findViewById(R.id.z_base_camera_showImg);

        saveBtn.setOnClickListener(this);
        showImg.setOnClickListener(this);
        tpImg.setOnClickListener(this);
        mHolder = mPreView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        if (!isPreview) {
            mCamera = Camera.open();
        }
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if (mCamera != null) {
            if (isPreview) {
                mCamera.stopPreview();
                isPreview = false;
            }

        }
    }

    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();

        if (mCamera != null) {
            if (!isPreview) {
                mCamera.startPreview();
                // 自动对焦
                mCamera.autoFocus(null);
                isPreview = true;
            }

        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        initCamera();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        // 当holder被回收时 释放硬件
        if (mCamera != null) {
            if (isPreview) {
                mCamera.stopPreview();
            }
            mCamera.release();
            mCamera = null;
        }


    };

    /**
     * 
     * @param value
     * @return
     * @throws Exception
     * @author zhx
     */
    public void initCamera() {

        if (mCamera != null && !isPreview) {
            try {
                Camera.Parameters parameters = mCamera.getParameters();
                // 设置闪光灯为自动
                parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
                mCamera.setParameters(parameters);
                resetCameraSize(parameters);
                // 设置图片格式
                parameters.setPictureFormat(ImageFormat.JPEG);
                // 设置JPG照片的质量
                parameters.set("jpeg-quality", 100);
                // 通过SurfaceView显示取景画面
                mCamera.setPreviewDisplay(mHolder);
                // 开始预览
                mCamera.startPreview();
                // 自动对焦 括号内 的参数为 对焦回掉 null 则不需要回掉 (稍后的版本会讲到这个)
                mCamera.autoFocus(null);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            isPreview = true;
        }

    }

    /**
     * 旋转相机和设置预览大小
     * 
     * @param parameters
     */
    public void resetCameraSize(Parameters parameters) {
        if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
            //
            mCamera.setDisplayOrientation(90);
        } else {
            mCamera.setDisplayOrientation(0);
        }
        // 设置预览图片大小 为设备 长宽
        parameters.setPreviewSize(displayPx.x, displayPx.y);
        // 设置图片大小 为设备 长宽
        parameters.setPictureSize(displayPx.x, displayPx.y);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.z_take_pictrue_img:
            // 第一个参数 是拍照的声音,未压缩的数据,压缩后的数据
            mCamera.takePicture(null, null, this);
            break;

        default:
            break;
        }
    }

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        // TODO Auto-generated method stub
        // 拍照回掉回来的 图片数据。
        Bitmap bitmap = BitmapFactory
                .decodeByteArray(data, 0, data.length, opt);
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

            Matrix matrix = new Matrix();
            matrix.setRotate(90, 0.1f, 0.1f);
            showImg.setImageBitmap(Bitmap.createBitmap(bitmap, 0, 0,
                    bitmap.getWidth(), bitmap.getHeight(), matrix, false));
            recycleBitmap(bitmap);
        } else {
            showImg.setImageBitmap(bitmap);
        }

        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.startPreview();
            isPreview = true;
        }
    }
/**
 * 
* @param value 
* @return 
* @throws Exception 
* @author zhx
 */
    public static void recycleBitmap(Bitmap bitmap) {
        if (!bitmap.isRecycled()) {
            bitmap.recycle();
        }
    }

}


Preview = true;
}
}
/**
*
* @param value
* @return
* @throws Exception
* @author zhx
*/
public static void recycleBitmap(Bitmap bitmap) {
if (!bitmap.isRecycled()) {
bitmap.recycle();
}
}

}

“`
2.0 xml 配置

“` android

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.zhx.view"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity android:name="org.zhx.view.camera.ui.ZCameraBaseAcitivy" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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

    <uses-feature android:name="android.hardware.c
amera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

</manifest>

4.用到的id

<item name="z_base_camera_preview" type="id"/>
    <item name="z_take_pictrue_img" type="id">
    <item name="z_base_camera_save" type="id"/>
    <item name="z_base_camera_showImg" type="id"/>
    <item name="z_base_camera_show_layout" type="id"/>
    <item name="z_base_camera_show_img" type="id"/>

源码地址:http://download.csdn.net/detail/u013783167/9270973

发布了16 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u013783167/article/details/49850993