package com.netease.nim.uikit.session.actions; import android.content.Intent; import android.text.TextUtils; import android.widget.Toast; import com.netease.nim.uikit.R; import com.netease.nim.uikit.common.media.picker.PickImageHelper; import com.netease.nim.uikit.common.media.picker.activity.PickImageActivity; import com.netease.nim.uikit.common.media.picker.activity.PreviewImageFromCameraActivity; import com.netease.nim.uikit.common.util.file.AttachmentStore; import com.netease.nim.uikit.common.util.media.ImageUtil; import com.netease.nim.uikit.common.util.storage.StorageType; import com.netease.nim.uikit.common.util.storage.StorageUtil; import com.netease.nim.uikit.common.util.string.StringUtil; import com.netease.nim.uikit.session.constant.Extras; import com.netease.nim.uikit.session.constant.RequestCode; import com.netease.nim.uikit.session.helper.SendImageHelper; import java.io.File; /** * Created by zhoujianghua on 2015/7/31. */ public abstract class PickImageAction extends BaseAction { private static final int PICK_IMAGE_COUNT = 9; private static final int PORTRAIT_IMAGE_WIDTH = 720; public static final String MIME_JPEG = "image/jpeg"; public static final String JPG = ".jpg"; private boolean multiSelect; private boolean crop = false; protected abstract void onPicked(File file); protected PickImageAction(int iconResId, int titleId, boolean multiSelect) { super(iconResId, titleId); this.multiSelect = multiSelect; } @Override public void onClick() { int requestCode = makeRequestCode(RequestCode.PICK_IMAGE); showSelector(getTitleId(), requestCode, multiSelect, tempFile()); } private String tempFile() { String filename = StringUtil.get32UUID() + JPG; return StorageUtil.getWritePath(filename, StorageType.TYPE_TEMP); } /** * 打开图片选择器 */ private void showSelector(int titleId, final int requestCode, final boolean multiSelect, final String outPath) { PickImageHelper.PickImageOption option = new PickImageHelper.PickImageOption(); option.titleResId = titleId; option.multiSelect = multiSelect; option.multiSelectMaxCount = PICK_IMAGE_COUNT; option.crop = crop; option.cropOutputImageWidth = PORTRAIT_IMAGE_WIDTH; option.cropOutputImageHeight = PORTRAIT_IMAGE_WIDTH; option.outputPath = outPath; PickImageHelper.pickImage(getActivity(), requestCode, option); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case RequestCode.PICK_IMAGE: onPickImageActivityResult(requestCode, data); break; case RequestCode.PREVIEW_IMAGE_FROM_CAMERA: onPreviewImageActivityResult(requestCode, data); break; } } /** * 图片选取回调 */ private void onPickImageActivityResult(int requestCode, Intent data) { if (data == null) { Toast.makeText(getActivity(), R.string.picker_image_error, Toast.LENGTH_LONG).show(); return; } boolean local = data.getBooleanExtra(Extras.EXTRA_FROM_LOCAL, false); if (local) { // 本地相册 sendImageAfterSelfImagePicker(data); } else { // 拍照 Intent intent = new Intent(); if (!handleImagePath(intent, data)) { return; } intent.setClass(getActivity(), PreviewImageFromCameraActivity.class); getActivity().startActivityForResult(intent, makeRequestCode(RequestCode.PREVIEW_IMAGE_FROM_CAMERA)); } } /** * 是否可以获取图片 */ private boolean handleImagePath(Intent intent, Intent data) { String photoPath = data.getStringExtra(Extras.EXTRA_FILE_PATH); if (TextUtils.isEmpty(photoPath)) { Toast.makeText(getActivity(), R.string.picker_image_error, Toast.LENGTH_LONG).show(); return false; } File imageFile = new File(photoPath); intent.putExtra("OrigImageFilePath", photoPath); File scaledImageFile = ImageUtil.getScaledImageFileWithMD5(imageFile, MIME_JPEG); boolean local = data.getExtras().getBoolean(Extras.EXTRA_FROM_LOCAL, true); if (!local) { // 删除拍照生成的临时文件 AttachmentStore.delete(photoPath); } if (scaledImageFile == null) { Toast.makeText(getActivity(), R.string.picker_image_error, Toast.LENGTH_LONG).show(); return false; } else { ImageUtil.makeThumbnail(getActivity(), scaledImageFile); } intent.putExtra("ImageFilePath", scaledImageFile.getAbsolutePath()); return true; } /** * 从预览界面点击发送图片 */ private void sendImageAfterPreviewPhotoActivityResult(Intent data) { SendImageHelper.sendImageAfterPreviewPhotoActivityResult(data, new SendImageHelper.Callback() { @Override public void sendImage(File file, boolean isOrig) { onPicked(file); } }); } /** * 发送图片 */ private void sendImageAfterSelfImagePicker(final Intent data) { SendImageHelper.sendImageAfterSelfImagePicker(getActivity(), data, new SendImageHelper.Callback() { @Override public void sendImage(File file, boolean isOrig) { onPicked(file); } }); } /** * 拍摄回调 */ private void onPreviewImageActivityResult(int requestCode, Intent data) { if (data.getBooleanExtra(PreviewImageFromCameraActivity.RESULT_SEND, false)) { sendImageAfterPreviewPhotoActivityResult(data); } else if (data.getBooleanExtra(PreviewImageFromCameraActivity.RESULT_RETAKE, false)) { String filename = StringUtil.get32UUID() + JPG; String path = StorageUtil.getWritePath(filename, StorageType.TYPE_TEMP); if (requestCode == RequestCode.PREVIEW_IMAGE_FROM_CAMERA) { PickImageActivity.start(getActivity(), makeRequestCode(RequestCode.PICK_IMAGE), PickImageActivity.FROM_CAMERA, path); } } } }