Android⾃定义照相机实现(拍照、保存到SD卡,安卓⾯试项⽬源码/**
按钮被点击触发的事件
@param v
*/
public void btnOnclick(View v) {
if (camera != null) {
switch (v.getId()) {
case R.id.takepicture:
// 拍照
camera.takePicture(null, null, new MyPictureCallback());
break;
}
}
}
/**
图⽚被点击触发的时间
@param v
*/
public void imageClick(View v) {
if (v.getId() == R.id.scalePic) {
if (bundle == null) {
Toast.makeText(getApplicationContext(), R.string.takephoto,
Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(this, ShowPicActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
}
}
private final class MyPictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
bundle = new Bundle();
bundle.putByteArray(“bytes”, data); //将图⽚字节数据保存在bundle当中,实现数据交换saveToSDCard(data); // 保存图⽚到sd卡中
Toast.makeText(getApplicationContext(), R.string.success,
Toast.LENGTH_SHORT).show();
camera.startPreview(); // 拍完照后,重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
将拍下来的照⽚存放在SD卡中
@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) + “.jpg”;
File fileFolder = new ExternalStorageDirectory()
“/finger/”);
if (!ists()) { // 如果⽬录不存在,则创建⼀个名为"finger"的⽬录
fileFolder.mkdir();
}
File jpgFile = new File(fileFolder, filename);
安卓intent用法FileOutputStream outputStream = new FileOutputStream(jpgFile); // ⽂件输出流outputStream.write(data); // 写⼊sd卡中
outputStream.close(); // 关闭输出流
}
private final class SurfaceCallback implements Callback {
// 拍照状态变化时调⽤该⽅法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
parameters = Parameters(); // 获取各项参数
parameters.setPictureFormat(PixelFormat.JPEG); // 设置图⽚格式
parameters.setPreviewSize(width, height); // 设置预览⼤⼩
parameters.setPreviewFrameRate(5); //设置每秒显⽰4帧
parameters.setPictureSize(width, height); // 设置保存的图⽚尺⼨
parameters.setJpegQuality(80); // 设置照⽚质量
}
// 开始拍照时调⽤该⽅法
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open(); // 打开摄像头
camera.setPreviewDisplay(holder); // 设置⽤于显⽰拍照影像的SurfaceHolder对象camera.setDisplayOrientation(getPreviewDegree(MainActivity.this));
camera.startPreview(); // 开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
// 停⽌拍照时调⽤该⽅法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera = null;
}
}
}
/**
点击⼿机屏幕是,显⽰两个按钮
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (Action()) {
case MotionEvent.ACTION_DOWN:
layout.setVisibility(ViewGroup.VISIBLE); // 设置视图可见
break;
}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_CAMERA: // 按下拍照按钮
if (camera != null && RepeatCount() == 0) {
/
/ 拍照
//注:调⽤takePicture()⽅法进⾏拍照是传⼊了⼀个PictureCallba
ck对象——当程序获取了拍照所得的图⽚数据之后
//,PictureCallback对象将会被回调,该对象可以负责对相⽚进⾏保存或传⼊⽹络camera.takePicture(null, null, new MyPictureCallback());
}
}
KeyDown(keyCode, event);
}
// 提供⼀个静态⽅法,⽤于根据⼿机⽅向获得相机预览画⾯旋转的⾓度
public static int getPreviewDegree(Activity activity) {
// 获得⼿机的⽅向
int rotation = WindowManager().getDefaultDisplay() .getRotation();
int degree = 0;
// 根据⼿机的⽅向计算相机预览画⾯应该选择的⾓度
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
}
⽤来显⽰图⽚的Activity:
package com.wwj.finger;
import android.app.Activity;
t.Intent;
aphics.Bitmap;
aphics.BitmapFactory;
aphics.Matrix;
import android.os.Bundle;
import android.widget.ImageView;
public class ShowPicActivity extends Activity {
private ImageView ivPic = null; // 显⽰图⽚控件
/**
Activity在创建的时候回调的函数 主要⽤来初始化⼀些变量

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。