package cm.android.util;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
/**
* 调用系统应用进行拍照、摄像、录音、选取图片等操作,某些操作需要获取权限
* <p/>
* <uses-permission android:name="android.permission.GET_TASKS" />
* <uses-permission android:name="android.permission.RECORD_AUDIO" />
* <uses-permission android:name="android.permission.CAMERA" />
*/
public class CameraUtil {
/**
* 调用系统照相机拍摄照片
*/
public static final int REQUEST_CODE_TAKE_PHOTO = 0xF1;
/**
* 调用系统照相机摄像
*/
public static final int REQUEST_CODE_TAKE_VIDEO = REQUEST_CODE_TAKE_PHOTO + 1;
/**
* 调用系统应用录音
*/
public static final int RESULT_CAPTURE_RECORDER_SOUND = REQUEST_CODE_TAKE_PHOTO + 2;
/**
* 从相册中选择一张图片
*/
public static final int REQUEST_CODE_PICK_PHOTO = REQUEST_CODE_TAKE_PHOTO + 3;
/**
* 从视频库中选择视频
*/
public static final int REQUEST_CODE_PICK_VIDEO = REQUEST_CODE_TAKE_PHOTO + 4;
/**
* 裁剪图片
*/
public static final int REQUEST_CODE_CROP = REQUEST_CODE_TAKE_PHOTO + 5;
private CameraUtil() {
}
private static Intent takeVideoIntent() {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
// 限制10s的录像
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
return intent;
}
private static Intent pickPhotoIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
return intent;
}
private static Intent pickVideoIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("video/*"); // String VIDEO_UNSPECIFIED = "video/*";
// Intent wrapperIntent = Intent.createChooser(innerIntent, null);
return intent;
}
private static Intent takeSoundRecorderIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/amr");
return intent;
}
private static Intent cropImageIntent(Uri uri, int width, int height) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
// true:返回数据为bitmap,false:返回uri
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// 取消人脸识别
intent.putExtra("noFaceDetection", true);
return intent;
}
public static Intent cropImageIntent(Uri uri, Uri outputUri, int width, int height) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
// intent.putExtra("data", data);
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
// true:返回数据为bitmap,false:返回uri
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// 取消人脸识别
intent.putExtra("noFaceDetection", true);
return intent;
}
/**
* 拍照获取图片
*/
public static Uri takePhoto(Activity activity) {
// 执行拍照前,应该先判断SD卡是否存在
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);// "android.media.action.IMAGE_CAPTURE"
/***
* 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图
* 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰
*/
ContentValues values = new ContentValues();
Uri photoUri = activity.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
activity.startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
return photoUri;
}
/**
* 拍摄视频
*/
public static void takeVideo(Activity activity) {
Intent intent = takeVideoIntent();
activity.startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
}
/**
* 录音功能
*/
public static void takeSoundRecorder(Activity activity) {
Intent intent = takeSoundRecorderIntent();
activity.startActivityForResult(intent, RESULT_CAPTURE_RECORDER_SOUND);
}
public static void pickPhoto(Activity activity) {
Intent intent = pickPhotoIntent();
activity.startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO);
}
/**
* 选取视频
*/
public static void pickVideo(Activity activity) {
Intent intent = pickVideoIntent();
activity.startActivityForResult(intent, REQUEST_CODE_PICK_VIDEO);
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////
public static Uri takePhoto(android.support.v4.app.Fragment fragment) {
// 执行拍照前,应该先判断SD卡是否存在
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);// "android.media.action.IMAGE_CAPTURE"
/***
* 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图
* 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰
*/
ContentValues values = new ContentValues();
Uri photoUri = fragment.getActivity().getContentResolver()
.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
fragment.startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
return photoUri;
}
public static void takeVideo(android.support.v4.app.Fragment fragment) {
Intent intent = takeVideoIntent();
fragment.startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
}
/**
* 从相册中取图片
*/
public static void pickPhoto(android.support.v4.app.Fragment fragment) {
Intent intent = pickPhotoIntent();
fragment.startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO);
}
public static void pickVideo(android.support.v4.app.Fragment fragment) {
Intent intent = pickVideoIntent();
fragment.startActivityForResult(intent, REQUEST_CODE_PICK_VIDEO);
}
// ////////////////////////////////
public static void cropImage(Uri uri, int width, int height,
Activity activity) {
Intent intent = cropImageIntent(uri, width, height);
activity.startActivityForResult(intent, REQUEST_CODE_CROP);
}
public static void cropImage(Uri uri, int width, int height,
android.support.v4.app.Fragment fragment) {
Intent intent = cropImageIntent(uri, width, height);
fragment.startActivityForResult(intent, REQUEST_CODE_CROP);
}
public static Uri gainImageUri(int requestCode, Intent data, Uri takeUri) {
Uri photoUri = null;
if (requestCode == CameraUtil.REQUEST_CODE_TAKE_PHOTO) {
if (data != null) {
photoUri = data.getData();
}
if (photoUri == null) {
photoUri = takeUri;
}
} else if (requestCode == CameraUtil.REQUEST_CODE_PICK_PHOTO) {
if (data != null) {
photoUri = data.getData();
}
} else if (requestCode == CameraUtil.REQUEST_CODE_CROP) {
// picdata.getExtras(), Bitmap photo = bundle.getParcelable("data");
// Bitmap photo1 = data.getParcelableExtra("data");
// TODO 需要测试
}
return photoUri;
}
}