在开始之前,先说下正常调用相机的状况:
正常调用相机,在
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE);
然后重写onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
}
在返回的data中的是一个压缩过的Bitmap,而且压缩的比较厉害,所以根本不会产生OOM异常,我试过之后,确实是一个清晰度相当低的一张图片,根本不能满足需求,所以就需要返回原图!!!当然这个原图是需要处理的,否则依然会出现OOM。
切入正题
首先理下思路:
1.定义一个Uri用来标记相机拍摄的照片
2.通过Intent启动相机,同时传递Uri
3.在onActivityResult方法中获取到拍摄图片的Uri,就能找到我们拍摄的原图
需要注意的是:
有的手机的Uri此时传递回onActivityResult时,通过data. getData()时为空,这时可以用一个变量引用之前的Uri 就好了
权限问题
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
启动相机代码:
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
String fileName = getPhotoFileName() + ".jpg";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
photoUri = Uri.fromFile(new File(path + fileName));
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQUEST_CODE);
}
path:系统相册的路径
private String path = Environment.getExternalStorageDirectory() +
File.separator + Environment.DIRECTORY_DCIM + File.separator;
"Environment.DIRECTORY_DCIM" 可以ctrl点进去看下,其实就是一个字符串,只不过是系统定义的,如下:
public static String DIRECTORY_DCIM = "DCIM";
getPhotoFileName():这个方法主要是实现对图片的命名,按照时间来命名,代码如下:
private String getPhotoFileName() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
return "IMG_" + dateFormat.format(date);
}
onActivityResult回调的代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {
return;
}
if (requestCode == REQUEST_CODE) {
Log.d(TAG, "开始回调");
Uri uri = null;
if (data != null && data.getData() != null) {
uri = data.getData();
}
if (uri == null) {
if (photoUri != null) {
uri = photoUri;
}
}
}
其中photoUri,这里我定义了一个全局变量,和“启动相机”里面的Uri是同一个变量
Uri photoUri;
接下来,我们可以通过seturi()方法来设置UI
mImageView.setImageURI(photoUri);
同时这里也是需要注意:
由于现在手机像素都很高,拍摄的照片都很大,几M左右,这时如果直接设置到UI中,有时候会遇到OOM异常,接下来就是压缩图片的问题了