`
zhonglunshun
  • 浏览: 134837 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android图片选取与调用系统裁剪

阅读更多

话不多说,直接给出一个工具类,想要的拿去

 

package com.locinengine.utils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.view.ContextThemeWrapper;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.Toast;

/**
 * 照片选择
 * 
 * @author larsonzhong@163.com
 * 
 */
public class PhotoPickUtil {
	private final int _2000 = 2000;
	private Activity activityContext;
	private Fragment fragmentContext;
	private OnPhotoPickedlistener onPhotoPickedlistener;

	public PhotoPickUtil(Activity context,
			OnPhotoPickedlistener onPhotoPickedlistener) {
		super();
		this.activityContext = context;
		this.onPhotoPickedlistener = onPhotoPickedlistener;
	}

	public PhotoPickUtil(Activity activityContext, Fragment fragmentContext,
			OnPhotoPickedlistener onPhotoPickedlistener) {
		super();
		this.activityContext = activityContext;
		this.fragmentContext = fragmentContext;
		this.onPhotoPickedlistener = onPhotoPickedlistener;
	}

/**
在调用的activity或fragment的onActivityResult(...)中调用次方法,处理拍照/相册返回的数据
*/
	public void pickResult(int requestCode, int resultCode, Intent data) {
		if (resultCode != Activity.RESULT_OK)
			return;
		switch (requestCode) {
		case CROPED_PHOTO: // 调用图片裁剪返回的
			Bitmap img = data.getParcelableExtra("data");
			if (onPhotoPickedlistener != null) {
				onPhotoPickedlistener.photoPicked(null, img);
			}

			break;

		case CAMERA_WITH_DATA: // 照相机程序返回的
			if (doCrop) {
				doCropPhoto(mCurrentPhotoFile, cropWidth, cropHeight);
			} else {
				if (onPhotoPickedlistener != null) {
					onPhotoPickedlistener.photoPicked(
							mCurrentPhotoFile.getPath(), null);
					mCurrentPhotoFile = null;
				}
			}
			break;
		case PHOTO_PICKED:
			Uri originalUri = data.getData(); // 调用相册选择返回的图片

			String path = getGalleryImgPath(originalUri);
			if (doCrop) {
				doCropPhoto(new File(path), cropWidth, cropHeight);
			} else {
				if (onPhotoPickedlistener != null) {
					onPhotoPickedlistener.photoPicked(path, null);
				}
			}
			break;
		}
	}

	private boolean doCrop;
	private int cropWidth;
	private int cropHeight;
	/*
	 * 用来标识请求照相功能的 activity
	 */
	public final int CAMERA_WITH_DATA = 3023;
	/*
	 * 用来标识请求 gallery 的 activity
	 */
	public final int CAMERA_CROP = 3022;
	/*
	 * 用来标识请求 gallery 的 activity
	 */
	public final int CROPED_PHOTO = 3021;
	public final int PHOTO_PICKED = 3024;
	/*
	 * 拍照的照片存储位置
	 */
	private final File PHOTO_DIR_SD = new File(
			Environment.getExternalStorageDirectory() + "/DCIM/Camera");
	private final File PHOTO_DIR_ROOT = new File(Environment.getRootDirectory()
			+ "/DCIM/Camera");
	private File mCurrentPhotoFile;// 照相机拍照得到的图片

	/**
	 * 有取消选择的图片(需设置监听器),拍照和选择图片3个选项
	 * 
	 * @param activity
	 * @param cropImg
	 * @param outWith
	 * @param outHeight
	 * @param cancelClickListener
	 */
	public void doPickPhotoAction(final boolean cropImg, final int outWith,
			final int outHeight,
			final OnPickPhotoCancelClickListener cancelClickListener) {
		this.doCrop = cropImg;
		this.cropWidth = outWith;
		this.cropHeight = outHeight;
		File dir = null;
		// showToast(activity, "若添加实时拍摄照片导致重启,请尝试在应用外拍照,再选择从相册中获取进行添加!");
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡
			dir = PHOTO_DIR_SD;
		} else {
			dir = PHOTO_DIR_ROOT;
		}
		if (!dir.exists()) {
			dir.mkdirs();// 创建照片的存储目录
		}
		mCurrentPhotoFile = new File(dir, getImgName());// 给新照的照片文件命名
		// Wrap our context to inflate list items using correct theme
		Context dialogContext = new ContextThemeWrapper(activityContext,
				android.R.style.Theme_Light);
		String cancel = "返回";
		String[] choices = new String[3];
		choices[0] = "清除";//
		choices[1] = "拍照";// getString(MediaStore.ACTION_IMAGE_CAPTURE); //拍照
		choices[2] = "从相册选择图片";// getString(R.string.pick_photo); //从相册中选择
		ListAdapter adapter = new ArrayAdapter<String>(dialogContext,
				android.R.layout.simple_list_item_1, choices);

		AlertDialog.Builder builder = new AlertDialog.Builder(dialogContext);
		builder.setTitle("选择图片");
		builder.setSingleChoiceItems(adapter, -1,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						switch (which) {
						case 0:
							if (cancelClickListener != null) {
								cancelClickListener.onClick();
							}
							dialog.dismiss();
							break;
						case 1: {
							doTakePhoto();
							break;

						}
						case 2:
							doPickPhotoFromGallery();// 从相册中去获取
							break;
						}
					}
				});
		builder.setNegativeButton(cancel,
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					}

				});
		builder.create().show();
	}

	/**
	 * 只有拍照和选择照片两个选项
	 * 
	 * @param activity
	 * @param cropImg
	 * @param outWith
	 * @param outHeight
	 */
	public void doPickPhotoAction(final boolean cropImg, final int outWith,
			final int outHeight) {
		this.doCrop = cropImg;
		this.cropWidth = outWith;
		this.cropHeight = outHeight;
		File dir = null;
		// showToast(activity, "若添加实时拍摄照片导致重启,请尝试在应用外拍照,再选择从相册中获取进行添加!");
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡
			dir = PHOTO_DIR_SD;
		} else {
			dir = PHOTO_DIR_ROOT;
		}
		if (!dir.exists()) {
			dir.mkdirs();// 创建照片的存储目录
		}
		mCurrentPhotoFile = new File(dir, getImgName());// 给新照的照片文件命名

		// Wrap our context to inflate list items using correct theme
		Context dialogContext = new ContextThemeWrapper(activityContext,
				android.R.style.Theme_Light);
		String cancel = "返回";
		String[] choices = new String[2];
		choices[0] = "拍照";// getString(MediaStore.ACTION_IMAGE_CAPTURE); //拍照
		choices[1] = "从相册选择图片";// getString(R.string.pick_photo); //从相册中选择
		ListAdapter adapter = new ArrayAdapter<String>(dialogContext,
				android.R.layout.simple_list_item_1, choices);

		AlertDialog.Builder builder = new AlertDialog.Builder(dialogContext);
		builder.setTitle("选择图片");
		builder.setSingleChoiceItems(adapter, -1,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						switch (which) {
						case 0: {
							doTakePhoto();
							break;

						}
						case 1:
							doPickPhotoFromGallery();// 从相册中去获取
							break;
						}
					}
				});
		builder.setNegativeButton(cancel,
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					}

				});
		builder.create().show();
	}

	/**
	 * 拍照获取图片
	 * 
	 * @param cropImg
	 * 
	 */
	private void doTakePhoto() {
		try {
			final Intent intent = getTakePickIntent(mCurrentPhotoFile);
			if (fragmentContext != null)
				fragmentContext
						.startActivityForResult(intent, CAMERA_WITH_DATA);
			else
				activityContext
						.startActivityForResult(intent, CAMERA_WITH_DATA);
		} catch (ActivityNotFoundException e) {
			e.printStackTrace();
			Toast.makeText(activityContext, "图片获取失败", _2000).show();
		}
	}

	private Intent getTakePickIntent(File f) {
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
		if (doCrop) {
			intent.putExtra("return-data", true);
		}
		return intent;
	}

	// 请求Gallery程序
	private void doPickPhotoFromGallery() {
		try {
			// Launch picker to choose photo for selected contact
			final Intent intent = getPhotoPickIntent();
			if (fragmentContext != null)
				fragmentContext.startActivityForResult(intent, PHOTO_PICKED);
			else
				activityContext.startActivityForResult(intent, PHOTO_PICKED);
		} catch (ActivityNotFoundException e) {
			e.printStackTrace();
			Toast.makeText(activityContext, "图片获取失败", _2000).show();
		}
	}

	// 封装请求Gallery的intent
	private Intent getPhotoPickIntent() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
		intent.setType("image/*");
		// if (cropImg) {
		// intent.putExtra("crop", "true");
		// // 设置裁剪框高宽比例和输出的图片尺寸,不设为原始尺寸
		// // if (outHeight > outWith) {
		// // intent.putExtra("aspectX", 1);
		// // intent.putExtra("aspectY", outHeight / outWith);
		// // } else if (outWith > outHeight) {
		// intent.putExtra("aspectX", outWith);
		// intent.putExtra("aspectY", outHeight);
		// // }
		// intent.putExtra("outputX", outWith);
		// intent.putExtra("outputY", outHeight);
		// // 设置使系统返回图片bitmap对象
		// intent.putExtra("return-data", true);
		// }
		return intent;
	}

	private void doCropPhoto(File f, int outWith, int outHeight) {
		try {
			// 启动gallery去剪辑这个照片
			final Intent intent = getCropImageIntent(Uri.fromFile(f), outWith,
					outHeight);
			if (fragmentContext != null)
				fragmentContext.startActivityForResult(intent, CROPED_PHOTO);
			else
				activityContext.startActivityForResult(intent, CROPED_PHOTO);
		} catch (Exception e) {
			Toast.makeText(activityContext, "图片获取失败", _2000).show();
		}
	}

	/**
	 * Constructs an intent for image cropping. 调用图片剪辑程序
	 */
	private Intent getCropImageIntent(Uri photoUri, int outWith, int outHeight) {
		Intent intent = new Intent("com.android.camera.action.CROP")
				.setDataAndType(photoUri, "image/*").putExtra("crop", "true")
				.putExtra("return-data", true);
		// .putExtra("scale", true)
		// // 黑边
		// .putExtra("scaleUpIfNeeded", true)
		// // 黑边
		intent.putExtra("aspectX", outWith);
		intent.putExtra("aspectY", outHeight);
		intent.putExtra("outputX", outWith);
		intent.putExtra("outputY", outHeight);
		return intent;
	}

	@SuppressWarnings("deprecation")
	private String getGalleryImgPath(Uri photoUri) {
		// 这里开始的第二部分,获取图片的路径:

		String[] proj = { MediaStore.Images.Media.DATA };

		// 好像是android多媒体数据库的封装接口,具体的看Android文档
		Cursor cursor = activityContext.managedQuery(photoUri, proj, null,
				null, null);

		// 按我个人理解 这个是获得用户选择的图片的索引值
		int column_index = cursor
				.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

		// 将光标移至开头 ,这个很重要,不小心很容易引起越界
		cursor.moveToFirst();

		// 最后根据索引值获取图片路径
		String path = cursor.getString(column_index);

		return path;
	}

	@SuppressLint("SimpleDateFormat")
	private String getImgName() {
		SimpleDateFormat sdf = new SimpleDateFormat();
		sdf.applyPattern("yyyyMMdd_HHmmsss");
		StringBuilder result = new StringBuilder("IMG_");
		result.append(sdf.format(new Date()) + (int) (Math.random() * 100))
				.append(".jpg");
		return result.toString();
	}

	public interface OnPhotoPickedlistener {

		public void photoPicked(String path, Bitmap bmp);
	}

	public interface OnPickPhotoCancelClickListener {

		public void onClick();
	}
}

 

0
0
分享到:
评论

相关推荐

    Android图片选择器,可轻松实现图片多张选取、图片预览、图片自由比例裁剪、图片压缩,功能超级强大

    1.适配安卓各种系统,支持android 11 2.图片过大不会引起 oom 3.动态获取系统权限, 4.支持相片 or 视频的单选和多选 5.支持裁剪比例设置,如常用的 1:1、3:4、3:2、16:9 默认为图片大小 6.支持视频预览 7.支持 gif...

    Unity调用Android/IOS系统相册、摄像机,选取后可以裁剪(Demo)

    最新版,Unity调用Android/IOS系统相册、摄像机,选取后可以裁剪(Demo)

    android图片选取与剪裁

    这个Demo用处非常广泛,主要演示的是在android设备下如何获取图片,并且将获取到的图片进行剪裁后再使用,欢迎大家下载源码,共同学习。源码的详细请参考博客: ...

    Android 拍照选取照片裁剪,角度旋转

    该项目包括调用系统相机拍照,和从系统选取图片,并对图片进行裁剪(仿微信做法),并解决三星手机拍照和选取照片角度旋转问题

    android从图片库选取照片或者拍照返回

    自己写的一个示例程序,可以从系统图片库中选图片,也可以使用摄像头拍摄新照片返回,如果图片太大还有处理 网上有其它关于图片裁剪的例子

    Android拍照或从图库选择图片并裁剪

    今天看《第一行代码》上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo。  一、 拍照选择图片 1、使用隐式Intent启动相机 //构建隐式Intent ...

    Unity3d调用IOS相册,对照片进行剪裁

    Unity3d 调用Ios相册,对图片进行剪彩,然后加载图片到Unity3d RawImage上面,为unity3d 2018.3.0工程

    Android仿微信QQ设置图形头像裁剪功能

    本节就为大家带来如何使用系统自带的裁剪工具进行图片裁剪~ 还是先来个简单的运行图。 额,简单说下,我待会会把代码写成小demo分享给大家,在文章末尾会附上github链接,需要的可以自行下载~ 下面来简单分析一下...

    使用Java代码在Android中实现图片裁剪功能

    主要介绍了使用Java代码在Android中实现图片裁剪功能,许多应用都需要此类从相册中选取图片然后编辑的功能,需要的朋友可以参考下

    使用gridView完成添加图片功能

    因为工作需求最近研究了图片上传的代码,这个demo是自己整理后应用的,添加图片是仿照微信上传图片时的弹出框,包含拍照和本地图片选取两部分,并且无论是本地选择相片还是拍照上传相片都带有裁剪功能,上传的图片...

    uTakePhoto:Android 拍照选择图片,裁剪,压缩,适配androidQ,不用重写activity,链式调用

    UTakePhoto简介支持系统拍照,及自定义Intent拍照支持相册选取,及自定义Intent获取支持图片压缩,默认采用鲁班压缩支持图片裁剪,系统裁剪及自带裁剪自动适配camera及sd权限适配AndroidQ链式调用如何使用 ...

    camera和相册的调用及对图形进行剪裁

    1、通过调用相机拍照,并将返回的照片进行剪裁 2、通过调用系统相册,并对选择的相片进行剪裁 3、解决小米等手机不能调用相机或不能进行剪裁问题

    Android拍照或选择本地图片并剪裁图片设置成头像

    有很多细小的知识点因为平时不怎么用,所以需要好好复习下,另外呢最近也在整理一些项目,发现现在很多的App中90%都有头像的设置,头像设置无非就是两种情况:1,从本地图片库中选取一张进行裁剪之后上传 ...

    Android实现拍照截取和相册图片截取

    原理就是通过intent调用系统的相机,拍完照在回调进行操作,成功获取到拍完照的图片根据uri调用系统的裁剪页面,裁剪完也是在回调中进行处理,显示在页面的imageview中。 2 相册选取图片 原理也是通过intent打开...

    PhotoPicker:android本地照片选择器,支持拍照,相册选择,单选,多选,压缩,裁剪

    Android相册选择,拍照库基本介绍链式调用,本地相册选择,支持多选,单选,压缩,裁剪,批量压缩,裁剪,适配Android6.0,7.0权限还有一些细节后续再完善补充,作者后期打算使用自己的这套库,并持续更新优化。...

    android上传头像

    android头像的上传:(可直接使用) 包括从相册中选取照片、拍照两种照片来源。 照片大小的裁剪与显示。 上传服务端,并由服务端存储为照片格式(含服务端demo)

    Android代码-ProCamera

    包括:裁剪,滤镜,字幕,印记,对比度等的调节。 即将上线功能: 30fps高清连拍,实现焦点和测光点的手动分离,0延迟快门拍摄,raw格式的图片输出、调节awb/iso/ae。 针对人像拍摄,提供面部识别功能,识别成功后...

    android_takephoto.zip

    takephoto.jar的功能 :相机获取图片、相册获取图片、剪切、压缩等功能。 TakePhoto在作用上类似于FragmentManager,无论是拍照、裁剪、从相册中选取、压缩都需要调用TakePhoto的方法。

Global site tag (gtag.js) - Google Analytics