写在前面,文章参考学习了慕课网自定义相机开发!记录下来帮助自己以后查看,也希望能给刚接触开发的同学一点小帮助!!!
1.首先是权限添加:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.布局文件:
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/bt_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="拍照"/>
<SurfaceView
android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/bt_camera"/>
</RelativeLayout>
3.核心代码:
<span style="color:#3333ff;">package com.example.camerattttttttttttt;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class customCamer extends Activity implements SurfaceHolder.Callback {
private Camera mCamera;
private SurfaceView mPreview;// 展示预览
private SurfaceHolder mHolder;
private PictureCallback mPictureCallback = new PictureCallback() {// 拍照
// 完成后的回调方法
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// File tempFile = new File("/sdcard/temp.png");
try {
// FileOutputStream fos = new FileOutputStream(tempFile);
// fos.write(data);
// fos.close();
// Intent intent = new Intent();
// intent.setClass(customCamer.this, Result.class);
// intent.putExtra("picpath", tempFile.getAbsolutePath());
// startActivity(intent);
// customCamer.this.finish();
Bundle bundle = new Bundle();
bundle.putByteArray("bytes", data);
saveToSDCard(data);// 保存文件到SD卡中
camera.startPreview();
// customCamer.this.finish();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
/**
* 相片保存的格式和位置
*
* @param data
* @throws IOException
*/
public static void saveToSDCard(byte[] data) throws IOException {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间
String filename = format.format(date) + ".jpeg";
File fileFolder = new File(Environment.getExternalStorageDirectory() + "/picture/");
if (!fileFolder.exists()) { // 如果目录不存在,则创建一个名为"finger"的目录
fileFolder.mkdir();
}
File jpgFile = new File(fileFolder, filename);
FileOutputStream fos = new FileOutputStream(jpgFile); // 文件输出流
fos.write(data); // 写入sd卡中
fos.close(); // 关闭输出流
}
private Button mBt;// 拍照按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
mBt = (Button) findViewById(R.id.bt_camera);
mPreview = (SurfaceView) findViewById(R.id.preview);// 使用surface要实现SurfaceHolder.Callback方法
mHolder = mPreview.getHolder();
mHolder.addCallback(this);// this 这个activity已经实现了Callback方法
test();// 直接就进行拍照
}
private void test() {
new Thread() {
@Override
public void run() {
Timer mtTimer = new Timer();
MyTaskOne myTaskOne = new MyTaskOne();
mtTimer.schedule(myTaskOne, 1000, 2000);
}
}.start();
}
public class MyTaskOne extends TimerTask {
@Override
public void run() {
// 设置聚焦方式为自动聚焦
mCamera.autoFocus(new AutoFocusCallback() {// 聚焦回调
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
mCamera.takePicture(null, null, mPictureCallback);
// 前两个参数可以为null,最后一个是拍照完成后的回调方法mPictureCallback
}
}
});
}
}
@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = getCamera();// 初始化相机
if (mHolder != null) {
setStartPreview(mCamera, mHolder);
}
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
/**
* 获取camera对象
*
* @return
*/
@SuppressWarnings("deprecation")
private Camera getCamera() {
Camera camera;
try {
camera = Camera.open();// 给自定义相机增加try块,发生异常时候,相机退出
} catch (Exception e) {
camera = null;
}
return camera;
}
/**
* 开始预览相机内容
*/
private void setStartPreview(Camera camera, SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);// 将相机实时预览界面与holder绑定,实时显示
camera.setDisplayOrientation(90);// 将系统camera预览角度进行调整为竖屏
camera.startPreview();// 开启预览界面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 释放相机占用的资源
*/
private void releaseCamera() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);// 相机回调置空
mCamera.stopPreview();// 停止预览
mCamera.release();
mCamera = null;// 相机置空
}
}
/**
*
* @param holder
* SurfaceHolder.Callback的方法要实现
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera, mHolder);// 绑定相机
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = mCamera.getParameters();// 设置相机参数
parameters.setPictureFormat(ImageFormat.JPEG);// 设置照片格式
parameters.setPreviewSize(2000, 1000);// 设置照片大小
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);// 自动对焦
parameters.setJpegQuality(100);// 设置照片质量
mCamera.stopPreview();// 停止相机预览
setStartPreview(mCamera, mHolder);// 重新绑定相机
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();// 释放相机
}
}
</span>