package com.anthony.imagepicker; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import com.anthony.imagepicker.bean.ImageFolder; import com.anthony.imagepicker.bean.ImageItem; import com.anthony.imagepicker.loader.ImageLoader; import com.anthony.imagepicker.view.CropImageView; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; /** * https://github.com/jeasonlzy/ImagePicker * ================================================ * 作 者:jeasonlzy(廖子尧 Github地址:https://github.com/jeasonlzy0216 * 版 本:1.0 * 创建日期:2016/5/19 * 描 述:图片选择的入口类 * 修订历史: * ================================================ */ public class ImagePicker { public static final String TAG = ImagePicker.class.getSimpleName(); public static final int REQUEST_CODE_TAKE = 1001; public static final int REQUEST_CODE_CROP = 1002; public static final int REQUEST_CODE_PREVIEW = 1003; public static final int RESULT_CODE_ITEMS = 1004; public static final int RESULT_CODE_BACK = 1005; public static final String EXTRA_RESULT_ITEMS = "extra_result_items"; public static final String EXTRA_SELECTED_IMAGE_POSITION = "selected_image_position"; public static final String EXTRA_IMAGE_ITEMS = "extra_image_items"; private boolean multiMode = true; //图片选择模式 private int selectLimit = 9; //最大选择图片数量 private boolean crop = true; //裁剪 private boolean showCamera = true; //显示相机 private boolean isSaveRectangle = false; //裁剪后的图片是否是矩形,否者跟随裁剪框的形状 private int outPutX = 800; //裁剪保存宽度 private int outPutY = 800; //裁剪保存高度 private int focusWidth = 280; //焦点框的宽度 private int focusHeight = 280; //焦点框的高度 private ImageLoader imageLoader; //图片加载器 private CropImageView.Style style = CropImageView.Style.RECTANGLE; //裁剪框的形状 private File cropCacheFolder; private File takeImageFile; public Bitmap cropBitmap; private ArrayList<ImageItem> mSelectedImages = new ArrayList<>(); //选中的图片集合 private List<ImageFolder> mImageFolders; //所有的图片文件夹 private int mCurrentImageFolderPosition = 0; //当前选中的文件夹位置 0表示所有图片 private List<OnImageSelectedListener> mImageSelectedListeners; // 图片选中的监听回调 private static ImagePicker mInstance; private ImagePicker() { } public static ImagePicker getInstance() { if (mInstance == null) { synchronized (ImagePicker.class) { if (mInstance == null) { mInstance = new ImagePicker(); } } } return mInstance; } public boolean isMultiMode() { return multiMode; } public void setMultiMode(boolean multiMode) { this.multiMode = multiMode; } public int getSelectLimit() { return selectLimit; } public void setSelectLimit(int selectLimit) { this.selectLimit = selectLimit; } public boolean isCrop() { return crop; } public void setCrop(boolean crop) { this.crop = crop; } public boolean isShowCamera() { return showCamera; } public void setShowCamera(boolean showCamera) { this.showCamera = showCamera; } public boolean isSaveRectangle() { return isSaveRectangle; } public void setSaveRectangle(boolean isSaveRectangle) { this.isSaveRectangle = isSaveRectangle; } public int getOutPutX() { return outPutX; } public void setOutPutX(int outPutX) { this.outPutX = outPutX; } public int getOutPutY() { return outPutY; } public void setOutPutY(int outPutY) { this.outPutY = outPutY; } public int getFocusWidth() { return focusWidth; } public void setFocusWidth(int focusWidth) { this.focusWidth = focusWidth; } public int getFocusHeight() { return focusHeight; } public void setFocusHeight(int focusHeight) { this.focusHeight = focusHeight; } public File getTakeImageFile() { return takeImageFile; } public File getCropCacheFolder(Context context) { if (cropCacheFolder == null) { cropCacheFolder = new File(context.getCacheDir() + "/ImagePicker/cropTemp/"); } return cropCacheFolder; } public void setCropCacheFolder(File cropCacheFolder) { this.cropCacheFolder = cropCacheFolder; } public ImageLoader getImageLoader() { return imageLoader; } public void setImageLoader(ImageLoader imageLoader) { this.imageLoader = imageLoader; } public CropImageView.Style getStyle() { return style; } public void setStyle(CropImageView.Style style) { this.style = style; } public List<ImageFolder> getImageFolders() { return mImageFolders; } public void setImageFolders(List<ImageFolder> imageFolders) { mImageFolders = imageFolders; } public int getCurrentImageFolderPosition() { return mCurrentImageFolderPosition; } public void setCurrentImageFolderPosition(int mCurrentSelectedImageSetPosition) { mCurrentImageFolderPosition = mCurrentSelectedImageSetPosition; } public ArrayList<ImageItem> getCurrentImageFolderItems() { return mImageFolders.get(mCurrentImageFolderPosition).images; } public boolean isSelect(ImageItem item) { return mSelectedImages.contains(item); } public int getSelectImageCount() { if (mSelectedImages == null) { return 0; } return mSelectedImages.size(); } public ArrayList<ImageItem> getSelectedImages() { return mSelectedImages; } public void clearSelectedImages() { if (mSelectedImages != null) mSelectedImages.clear(); } public void clear() { if (mImageSelectedListeners != null) { mImageSelectedListeners.clear(); mImageSelectedListeners = null; } if (mImageFolders != null) { mImageFolders.clear(); mImageFolders = null; } if (mSelectedImages != null) { mSelectedImages.clear(); } mCurrentImageFolderPosition = 0; } /** 拍照的方法 */ public void takePicture(Activity activity, int requestCode) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) { if (Utils.existSDCard()) takeImageFile = new File(Environment.getExternalStorageDirectory(), "/DCIM/camera/"); else takeImageFile = Environment.getDataDirectory(); takeImageFile = createFile(takeImageFile, "IMG_", ".jpg"); if (takeImageFile != null) { // 默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // 照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片, // 可以通过dat extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据, // 如果没有指定uri,则data就返回有数据! takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(takeImageFile)); } } activity.startActivityForResult(takePictureIntent, requestCode); } /** 根据系统时间、前缀、后缀产生一个文件 */ public static File createFile(File folder, String prefix, String suffix) { if (!folder.exists() || !folder.isDirectory()) folder.mkdirs(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA); String filename = prefix + dateFormat.format(new Date(System.currentTimeMillis())) + suffix; return new File(folder, filename); } /** 扫描图片 */ public static void galleryAddPic(Context context, File file) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(file); mediaScanIntent.setData(contentUri); context.sendBroadcast(mediaScanIntent); } /** 图片选中的监听 */ public interface OnImageSelectedListener { void onImageSelected(int position, ImageItem item, boolean isAdd); } public void addOnImageSelectedListener(OnImageSelectedListener l) { if (mImageSelectedListeners == null) mImageSelectedListeners = new ArrayList<>(); mImageSelectedListeners.add(l); } public void removeOnImageSelectedListener(OnImageSelectedListener l) { if (mImageSelectedListeners == null) return; mImageSelectedListeners.remove(l); } public void addSelectedImageItem(int position, ImageItem item, boolean isAdd) { if (isAdd) mSelectedImages.add(item); else mSelectedImages.remove(item); notifyImageSelectedChanged(position, item, isAdd); } private void notifyImageSelectedChanged(int position, ImageItem item, boolean isAdd) { if (mImageSelectedListeners == null) return; for (OnImageSelectedListener l : mImageSelectedListeners) { l.onImageSelected(position, item, isAdd); } } }