androidの调用系统相机拍照
1. 通过Intent直接调用系统相机
1. 直接调用系统的相机应用,只需要在Intent对象中传入相应的参数即可
2. 使用startActivityForResult()方法,并传入上面的intent对象, 之后,
系统自带的相机应用就会启动,用户就可以用它来拍照或者录像。
3. 用onActivityResult()接收传回的图像,
当用户拍完照片或者录像,或者取消后,系统都会调用这个函数。
2. 源码分析
package com.wyl.example;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
//定义了本实例的主要Activity
public class MainActivity extends Activity {
private static final int RESULT_CAPTURE_IMAGE = 1;// 照相的requestCode
private String strImgPath = "";// 照片文件绝对路径
// 定义拍照的按钮
private Button btnTakePhoto;
// 定义预览图片的imageview
private ImageView ivSurface;
//保存的拍照文件
private File out;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 得到布局中的所有对象
findView();
// 设置对象的监听器
setListener();
}
private void findView() {
// 得到布局中的所有对象
btnTakePhoto = (Button) findViewById(R.id.btn_takephoto);
ivSurface = (ImageView) findViewById(R.id.iv_image);
}
// 设置对象的监听器
private void setListener() {
btnTakePhoto.setOnClickListener(listener);
}
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
// 拍照的按钮
case R.id.btn_takephoto:
cameraMethod();
break;
}
}
};
//照相功能
private void cameraMethod() {
// 实例化拍照的Intent
Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 设置图片存放的路径,Environment.getExternalStorageDirectory()得到SD卡的根目录
strImgPath = Environment.getExternalStorageDirectory().toString()
+ "/CONSDCGMPIC/";// 存放照片的文件夹
// 给相片命名
String fileName = new SimpleDateFormat("yyyyMMddHHmmss")
.format(new Date()) + ".jpg";// 照片命名
// 检查存放的路径是否存在,如果不存在则创建目录
out = new File(strImgPath);
if (!out.exists()) {
out.mkdirs();
}
// 在此目录下创建文件
out = new File(strImgPath, fileName);
// 该照片的绝对路径
strImgPath = strImgPath + fileName;
// 启动ACITIVITY
startActivityForResult(imageCaptureIntent, RESULT_CAPTURE_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_CAPTURE_IMAGE:// 拍照
// 如果返回为正确的的结果
if (resultCode == RESULT_OK) {
// intent.getExtras()得到intent所附带的额外数据,在这也就是拍摄的图片
Bundle extras = data.getExtras();
// 得到额外的数据的data字段,转化为bitmap类型
Bitmap b = (Bitmap) extras.get("data");
// 实例化矩阵Matrix
Matrix matrix = new Matrix();
// 设置缩放
matrix.postScale(5f, 4f);
// 创建bitmap对象,并设置bitmap的参数
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(),
matrix, true);
// 设置imageview的图片资源
ivSurface.setImageBitmap(b);
try {
// 把文件转化为outputstream
FileOutputStream outStream = new FileOutputStream(out);
// 把bitmap数据写入字符流中
b.compress(CompressFormat.JPEG, 100, outStream);
// 关闭字符流
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
}
}
3. 效果图
4. 源码下载