android 自定义相机
1.学习 自定义相机 所用到的类 硬件类android.hardware.Camera 。
2.预览类 android.view.SurfaceView 预览辅助类 android.view.SurfaceHolder。
注意事项
- 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"/>