package com.mfh.comna.utils; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import com.mfh.comna.api.helper.UIHelper; import com.mfh.comna.api.utils.ImageUtil; import com.mfh.comna.comn.logic.IService; import java.io.File; /** * 相机一次拍照过程工具类,分成两个步骤: * 1、调用者先调用makeCameraRequest方法启动拍照程序 * 2、调用者在onActivityResult中再调用getCameraResultFile获取拍照结果。 * 注意必须使用服务工厂,不能使用new得到本对象 * Created by Administrator on 14-5-17. */ public class CameraSessionUtil implements IService { private transient Uri cameraImgUrl = null;//用来存储相机拍照的文件url,临时变量 /** * 生成调用相机的请求intent,指示生成外部文件。 * requestCode为:MsgConstants.CODE_REQUEST_CAMERA * @param context * @param requestCode 若为空,默认为MsgConstants.CODE_REQUEST_CAMERA * @return 外部文件的uri地址,后面拍照完成后可以使用 */ public void makeCameraRequest(Activity context, int... requestCode) { cameraImgUrl = null;//先初始化 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ContentValues values = new ContentValues(1); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); cameraImgUrl = context.getContentResolver() .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraImgUrl); int factCode = UIHelper.REQUEST_CODE_CAMERA; if (requestCode != null && requestCode.length > 0) factCode = requestCode[0]; context.startActivityForResult(intent, UIHelper.REQUEST_CODE_CAMERA); //return cameraImgUrl; } /** * 获取相机拍照后得到的压缩文件对象. * 要求resultCode == Activity.RESULT_OK,调用者自己判断 * @param resultCode 相机程序返回码 * @param data 相机程序返回的intent * @param context 当前操作的上下文 * @return */ public File getCameraResultFile(int resultCode, Intent data, Activity context, Uri uri) { if (resultCode != Activity.RESULT_OK) return null; String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 throw new RuntimeException("SD card is not avaiable/writeable right now."); } //Uri uri = null; if (data == null) { //uri = this.cameraImgUrl; if (uri == null) throw new RuntimeException("获取相机返回的图片地址为空,请进行版本适配!"); return ImageUtil.uriToCompressFile(context, uri); } else { uri = data.getData(); if (uri == null) { Bundle bundle = data.getExtras(); //但发现某些4.2版本返回的是缩略图,所以在调用相机时明确指定使用外部存储,然后使用第一个分支(此时intent为null) Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 return ImageUtil.bitMapToCompressFile(bitmap); } else { return ImageUtil.uriToCompressFile(context, uri); } } } /** * 获取相机拍照后得到的压缩文件对象. * 要求resultCode == Activity.RESULT_OK,调用者自己判断 * @param resultCode 相机程序返回码 * @param data 相机程序返回的intent * @param context 当前操作的上下文 * @return */ public File getCameraResultFile(int resultCode, Intent data, Activity context) { if (resultCode != Activity.RESULT_OK) return null; String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 throw new RuntimeException("SD card is not avaiable/writeable right now."); } Uri uri = null; if (data == null) { uri = this.cameraImgUrl; if (uri == null) throw new RuntimeException("获取相机返回的图片地址为空,请进行版本适配!"); return ImageUtil.uriToCompressFile(context, uri); } else { uri = data.getData(); if (uri == null) { Bundle bundle = data.getExtras(); //但发现某些4.2版本返回的是缩略图,所以在调用相机时明确指定使用外部存储,然后使用第一个分支(此时intent为null) Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 return ImageUtil.bitMapToCompressFile(bitmap); } else { return ImageUtil.uriToCompressFile(context, uri); } } } public String getFilePath(int resultCode, Intent data, Activity context) { if (resultCode != Activity.RESULT_OK) return null; String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 throw new RuntimeException("SD card is not avaiable/writeable right now."); } Uri uri = null; if (data == null) { uri = this.cameraImgUrl; if (uri == null) throw new RuntimeException("获取相机返回的图片地址为空,请进行版本适配!"); return ImageUtil.uriToPath(context.getContentResolver(),uri); }else { uri = data.getData(); return ImageUtil.uriToPath(context.getContentResolver(), uri); } } }