全栈工程师开发手册 (作者:栾鹏)
​​ 安卓教程全解​​

安卓调用系统拍照功能,两种方式获取拍摄的照片。

1、启动系统拍照intent,并直接返回图片数据

2、启动系统拍照intent,拍照后存储在指定的路径下,返回后app主动读取路径下的图片文件。

第一种方式:启动拍照,返回图片数据

获取拍摄的照片,照片数据存放在内存中

public void takephone() {
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), 0);
}

第二种方式:启动拍照,图片存储到指定路径下

使用一个intent请求拍照,照片存储在指定位置

//函数外要先定义一个Uri对象,存储图片路径。
private Uri outputFileUri;


//启动拍照的函数
public void takephone_save() {
//创建输出文件
File file = new File(Environment.getExternalStorageDirectory(),"test.jpg"); //存放在sd卡的根目录下
outputFileUri = Uri.fromFile(file);

//生成Intent.
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

//启动摄像头应用程序
startActivityForResult(intent, 0);
}

接收系统拍照的事件的返回结果(1返回图片数据,2返回图片地址)

除了可以根据返回的intent,也可以根据请求码来区别。

对于包含图片数据的,直接将数据转换为bitmap,对于不包含图片数据的这判定为存储在了指定位置。通过uri获取图片路径,在填充到控件背景中。

@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data) {
if (requestCode == TAKE_PICTURE) {
//检查是否包含缩略图
if (data != null) {
if (data.hasExtra("data")) { //从一个intent接收图片
Log.v("系统拍照", "内存中有图片数据");
Bitmap thumbnail = data.getParcelableExtra("data");
//使用bitmap图片做其他处理
imageView.setImageBitmap(thumbnail);
}
} else {
Log.v("系统拍照", "内存中没有图片数据");
//如果没有缩略图,则说明图像存储在目标输出URI中
int width = imageView.getWidth();
int height = imageView.getHeight();

BitmapFactory.Options factoryOptions = new BitmapFactory.Options();

factoryOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(outputFileUri.getPath(), factoryOptions);

int imageWidth = factoryOptions.outWidth;
int imageHeight = factoryOptions.outHeight;

// 确定将图像缩小多少
int scaleFactor = Math.min(imageWidth/width, imageHeight/height);

//将图像文件解码为图像大小以填充视图
factoryOptions.inJustDecodeBounds = false;
factoryOptions.inSampleSize = scaleFactor;
factoryOptions.inPurgeable = true;

Bitmap bitmap = BitmapFactory.decodeFile(outputFileUri.getPath(),factoryOptions);
//使用bitmap图片做其他处理
imageView.setImageBitmap(bitmap);
}
}
}