package com.luck.picture.lib.ui; import android.Manifest; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.AudioManager; import android.media.MediaMetadataRetriever; import android.media.SoundPool; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.support.v4.content.FileProvider; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SimpleItemAnimator; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.luck.picture.lib.R; import com.luck.picture.lib.adapter.PictureImageGridAdapter; import com.luck.picture.lib.compress.CompressConfig; import com.luck.picture.lib.compress.CompressImageOptions; import com.luck.picture.lib.compress.CompressInterface; import com.luck.picture.lib.compress.LubanOptions; import com.luck.picture.lib.decoration.GridSpacingItemDecoration; import com.luck.picture.lib.model.FunctionConfig; import com.luck.picture.lib.model.FunctionOptions; import com.luck.picture.lib.model.LocalMediaLoader; import com.luck.picture.lib.model.PictureConfig; import com.luck.picture.lib.observable.ImagesObservable; import com.luck.picture.lib.widget.MyItemAnimator; import com.yalantis.ucrop.MultiUCrop; import com.yalantis.ucrop.UCrop; import com.yalantis.ucrop.dialog.SweetAlertDialog; import com.yalantis.ucrop.entity.EventEntity; import com.yalantis.ucrop.entity.LocalMedia; import com.yalantis.ucrop.entity.LocalMediaFolder; import com.yalantis.ucrop.rxbus2.RxBus; import com.yalantis.ucrop.rxbus2.Subscribe; import com.yalantis.ucrop.rxbus2.ThreadMode; import com.yalantis.ucrop.util.FileUtils; import com.yalantis.ucrop.util.ScreenUtils; import com.yalantis.ucrop.util.ToolbarUtil; import com.yalantis.ucrop.util.Utils; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * author:luck * project:PictureSelector * package:com.luck.picture.ui * email:893855882@qq.com * data:16/12/31 */ public class PictureImageGridActivity extends PictureBaseActivity implements View.OnClickListener, PictureImageGridAdapter.OnPhotoSelectChangedListener { public final String TAG = PictureImageGridActivity.class.getSimpleName(); private List<LocalMedia> images; private RecyclerView recyclerView; private TextView tv_img_num; private TextView tv_ok; private RelativeLayout rl_bottom; private ImageView picture_left_back; private RelativeLayout rl_picture_title; private TextView picture_tv_title, picture_tv_right; private Animation animation = null; private TextView id_preview; private PictureImageGridAdapter adapter; private String cameraPath; private SweetAlertDialog dialog; private List<LocalMediaFolder> folders; private boolean is_top_activity; private boolean takePhoto = false;// 是否只单独调用拍照 private boolean takePhotoSuccess = false;// 单独拍照是否成功 private SoundPool soundPool;//声明一个SoundPool private int soundID;//创建某个声音对应的音频ID //EventBus 3.0 回调 @Subscribe(threadMode = ThreadMode.MAIN) public void eventBus(EventEntity obj) { switch (obj.what) { case FunctionConfig.CLOSE_FLAG: // 关闭activity finish(); overridePendingTransition(0, R.anim.slide_bottom_out); break; case FunctionConfig.UPDATE_FLAG: // 预览时勾选图片更新回调 List<LocalMedia> selectImages = obj.medias; adapter.bindSelectImages(selectImages); break; case FunctionConfig.CROP_FLAG: // 裁剪返回的数据 List<LocalMedia> result = obj.medias; if (result == null) result = new ArrayList<>(); handleCropResult(result); break; } } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!RxBus.getDefault().isRegistered(this)) { RxBus.getDefault().register(this); } takePhoto = getIntent().getBooleanExtra(FunctionConfig.FUNCTION_TAKE, false); getOnSaveValues(savedInstanceState); // 单独拍照 if (takePhoto) { if (savedInstanceState == null) { if (hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) { onTakePhoto(); } else { requestPermission(FunctionConfig.READ_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE); } } // 如果单独拍照,这里显示一个蒙版过渡一下 setContentView(R.layout.picture_empty); ToolbarUtil.setColorNoTranslucent(this, R.color.black); } else { setContentView(R.layout.picture_activity_image_grid); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); rl_bottom = (RelativeLayout) findViewById(R.id.rl_bottom); picture_left_back = (ImageView) findViewById(R.id.picture_left_back); rl_picture_title = (RelativeLayout) findViewById(R.id.rl_picture_title); picture_tv_title = (TextView) findViewById(R.id.picture_tv_title); picture_tv_right = (TextView) findViewById(R.id.picture_tv_right); picture_tv_title.setTextColor(title_color); picture_tv_right.setTextColor(right_color); rl_picture_title.setBackgroundColor(backgroundColor); ToolbarUtil.setColorNoTranslucent(this, statusBar); tv_ok = (TextView) findViewById(R.id.tv_ok); id_preview = (TextView) findViewById(R.id.id_preview); tv_img_num = (TextView) findViewById(R.id.tv_img_num); id_preview.setText(getString(R.string.picture_preview)); if (isNumComplete) { tv_ok.setText(getString(R.string.picture_done)); } else { animation = AnimationUtils.loadAnimation(this, R.anim.modal_in); tv_ok.setText(getString(R.string.picture_please_select)); } id_preview.setOnClickListener(this); tv_ok.setOnClickListener(this); picture_left_back.setImageResource(leftDrawable); picture_left_back.setOnClickListener(this); picture_tv_right.setOnClickListener(this); is_top_activity = getIntent().getBooleanExtra(FunctionConfig.EXTRA_IS_TOP_ACTIVITY, false); if (!is_top_activity) { // 第一次启动ImageActivity,没有获取过相册列表 // 先判断手机是否有读取权限,主要是针对6.0已上系统 if (hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) { readLocalMedia(); } else { requestPermission(FunctionConfig.READ_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE); } } else { selectMedias = (List<LocalMedia>) getIntent().getSerializableExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST); } String folderName = getIntent().getStringExtra(FunctionConfig.FOLDER_NAME); folders = ImagesObservable.getInstance().readLocalFolders(); // 获取图片 images = ImagesObservable.getInstance().readLocalMedias(); if (enablePreview && selectMode == FunctionConfig.MODE_MULTIPLE) { if (type == FunctionConfig.TYPE_VIDEO) { // 如果是视频不能预览 id_preview.setVisibility(View.GONE); } else { id_preview.setVisibility(View.VISIBLE); } } else if (selectMode == FunctionConfig.MODE_SINGLE) { rl_bottom.setVisibility(View.GONE); } else { id_preview.setVisibility(View.GONE); } if (folderName != null && !folderName.equals("")) { picture_tv_title.setText(folderName); } else { switch (type) { case FunctionConfig.TYPE_IMAGE: picture_tv_title.setText(getString(R.string.picture_lately_image)); break; case FunctionConfig.TYPE_VIDEO: picture_tv_title.setText(getString(R.string.picture_lately_video)); break; } } rl_bottom.setBackgroundColor(bottomBgColor); id_preview.setTextColor(previewColor); tv_ok.setTextColor(completeColor); picture_tv_right.setText(getString(R.string.picture_cancel)); recyclerView.setHasFixedSize(true); recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, ScreenUtils.dip2px(this, 2), false)); recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount)); // 解决调用 notifyItemChanged 闪烁问题,取消默认动画 ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); if (!is_checked_num) { recyclerView.setItemAnimator(new MyItemAnimator()); } else { // 如果是显示数据风格,则默认为qq选择风格 tv_img_num.setBackgroundResource(cb_drawable); tv_img_num.setSelected(true); } String titleText = picture_tv_title.getText().toString().trim(); if (showCamera) { if (!Utils.isNull(titleText) && titleText.startsWith("最近") || titleText.startsWith("Recent")) { // 只有最近相册 才显示拍摄按钮,不然相片混乱 showCamera = true; } else { showCamera = false; } } if (clickVideo) { if (soundPool == null) { soundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0); soundID = soundPool.load(mContext, R.raw.music, 1); } } adapter = new PictureImageGridAdapter(this, options.isGif(), showCamera, maxSelectNum, selectMode, enablePreview, enablePreviewVideo, cb_drawable, is_checked_num, type, clickVideo, soundPool, soundID); recyclerView.setAdapter(adapter); if (selectMedias != null && selectMedias.size() > 0) { ChangeImageNumber(selectMedias); adapter.bindSelectImages(selectMedias); } adapter.bindImagesData(images); adapter.setOnPhotoSelectChangedListener(PictureImageGridActivity.this); } } /** * 取拍照时 此activity被暂时回收存储的值 * * @param savedInstanceState */ private void getOnSaveValues(Bundle savedInstanceState) { if (savedInstanceState != null) { cameraPath = savedInstanceState.getString(FunctionConfig.BUNDLE_CAMERA_PATH); takePhoto = savedInstanceState.getBoolean(FunctionConfig.FUNCTION_TAKE); takePhotoSuccess = savedInstanceState.getBoolean(FunctionConfig.TAKE_PHOTO_SUCCESS); options = (FunctionOptions) savedInstanceState.getSerializable(FunctionConfig.EXTRA_THIS_CONFIG); enableCrop = options.isEnableCrop(); isCompress = options.isCompress(); selectMode = options.getSelectMode(); } } @Override protected void onResume() { super.onResume(); if (picture_tv_right != null && !picture_tv_right.isEnabled()) { picture_tv_right.setEnabled(true); } } @Override protected void readLocalMedia() { if (takePhoto) { // 单独拍照 先判断下是否有sdCard权限 onTakePhoto(); } else { /** * 根据type决定,查询本地图片或视频。 */ showPleaseDialog(getString(R.string.picture_please)); new LocalMediaLoader(this, type, options.isGif(), videoS).loadAllImage(new LocalMediaLoader.LocalMediaLoadListener() { @Override public void loadComplete(List<LocalMediaFolder> folders) { dismiss(); if (folders.size() > 0) { // 取最近相册或视频数据 LocalMediaFolder folder = folders.get(0); images = folder.getImages(); adapter.bindImagesData(images); PictureImageGridActivity.this.folders = folders; ImagesObservable.getInstance().saveLocalFolders(folders); ImagesObservable.getInstance().notifyFolderObserver(folders); } } }); } } @Override public void onClick(View view) { Intent intent = new Intent(); int id = view.getId(); if (id == R.id.picture_left_back) { activityFinish(1); } else if (id == R.id.picture_tv_right) { activityFinish(2); releaseCallBack(); } else if (id == R.id.id_preview) { if (Utils.isFastDoubleClick()) { return; } List<LocalMedia> selectedImages = adapter.getSelectedImages(); List<LocalMedia> medias = new ArrayList<>(); for (LocalMedia media : selectedImages) { medias.add(media); } intent.putExtra(FunctionConfig.EXTRA_PREVIEW_LIST, (Serializable) medias); intent.putExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) selectedImages); intent.putExtra(FunctionConfig.EXTRA_POSITION, 0); intent.putExtra(FunctionConfig.EXTRA_BOTTOM_PREVIEW, true); intent.putExtra(FunctionConfig.EXTRA_THIS_CONFIG, options); intent.setClass(mContext, PicturePreviewActivity.class); startActivityForResult(intent, FunctionConfig.REQUEST_PREVIEW); } else if (id == R.id.tv_ok) { List<LocalMedia> images = adapter.getSelectedImages(); // 如果设置了图片最小选择数量,则判断是否满足条件 int size = images.size(); if (minSelectNum > 0 && selectMode == FunctionConfig.MODE_MULTIPLE) { if (size < minSelectNum) { switch (type) { case FunctionConfig.TYPE_IMAGE: showToast(getString(R.string.picture_min_img_num, options.getMinSelectNum())); return; case FunctionConfig.TYPE_VIDEO: showToast(getString(R.string.picture_min_video_num, options.getMinSelectNum())); return; default: break; } } } if (enableCrop && type == FunctionConfig.TYPE_IMAGE && selectMode == FunctionConfig.MODE_MULTIPLE) { // 是图片和选择压缩并且是多张,调用批量压缩 startMultiCrop(images); } else { // 图片才压缩,视频不管 if (isCompress && type == FunctionConfig.TYPE_IMAGE) { compressImage(images); } else { resultBack(images); } } } } private void resultBack(List<LocalMedia> images) { onResult(images); } @Override public void onTakePhoto() { // 启动相机拍照,先判断手机是否有拍照权限 if (hasPermission(Manifest.permission.CAMERA)) { startCamera(); } else { requestPermission(FunctionConfig.CAMERA, Manifest.permission.CAMERA); } } @Override public void onChange(List<LocalMedia> selectImages) { ChangeImageNumber(selectImages); } /** * 图片选中数量 * * @param selectImages */ public void ChangeImageNumber(List<LocalMedia> selectImages) { boolean enable = selectImages.size() != 0; if (enable) { tv_ok.setEnabled(true); id_preview.setEnabled(true); if (isNumComplete) { tv_ok.setText(getString(R.string.picture_done_front_num, selectImages.size(), maxSelectNum)); } else { tv_img_num.startAnimation(animation); tv_img_num.setVisibility(View.VISIBLE); tv_img_num.setText(selectImages.size() + ""); tv_ok.setText(getString(R.string.picture_completed)); } } else { tv_ok.setEnabled(false); id_preview.setEnabled(false); if (isNumComplete) { tv_ok.setText(getString(R.string.picture_done)); } else { tv_img_num.setVisibility(View.INVISIBLE); tv_ok.setText(getString(R.string.picture_please_select)); } } } @Override public void startCamera() { if (!Utils.isFastDoubleClick()) { switch (type) { case FunctionConfig.TYPE_IMAGE: // 拍照 startOpenCamera(); break; case FunctionConfig.TYPE_VIDEO: // 录视频 startOpenCameraVideo(); break; } } } @Override public void onPictureClick(LocalMedia media, int position) { if (!Utils.isFastDoubleClick2()) { startPreview(adapter.getImages(), position); } } public void startPreview(List<LocalMedia> previewImages, int position) { LocalMedia media = previewImages.get(position); int type = media.getType(); Intent intent = new Intent(); Bundle bundle = new Bundle(); switch (type) { case FunctionConfig.TYPE_IMAGE: if (enableCrop && selectMode == FunctionConfig.MODE_SINGLE) { startCrop(media.getPath()); } else if (!enableCrop && selectMode == FunctionConfig.MODE_SINGLE) { ArrayList<LocalMedia> result = new ArrayList<>(); LocalMedia m = new LocalMedia(); m.setPath(media.getPath()); m.setType(type); result.add(m); if (isCompress) { compressImage(result); } else { onSelectDone(result); } } else { // 图片可以预览 if (Utils.isFastDoubleClick()) { return; } ImagesObservable.getInstance().saveLocalMedia(previewImages); List<LocalMedia> selectedImages = adapter.getSelectedImages(); intent.putExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) selectedImages); intent.putExtra(FunctionConfig.EXTRA_POSITION, position); intent.putExtra(FunctionConfig.EXTRA_THIS_CONFIG, options); intent.setClass(mContext, PicturePreviewActivity.class); startActivityForResult(intent, FunctionConfig.REQUEST_PREVIEW); } break; case FunctionConfig.TYPE_VIDEO: // 视频 if (selectMode == FunctionConfig.MODE_SINGLE) { // 单选 List<LocalMedia> result = new ArrayList<>(); LocalMedia m = new LocalMedia(); m.setPath(media.getPath()); m.setDuration(media.getDuration()); m.setType(type); result.add(m); onSelectDone(result); } else { if (Utils.isFastDoubleClick()) { return; } bundle.putString("video_path", media.getPath()); bundle.putSerializable(FunctionConfig.EXTRA_THIS_CONFIG, options); startActivity(PictureVideoPlayActivity.class, bundle); } break; } } /** * 裁剪 * * @param path */ protected void startCrop(String path) { // 如果开启裁剪 并且是单选 // 去裁剪 if (Utils.isFastDoubleClick()) { return; } UCrop uCrop = UCrop.of(Uri.parse(path), Uri.fromFile(new File(getCacheDir(), System.currentTimeMillis() + ".jpg"))); UCrop.Options options = new UCrop.Options(); if (offsetX > 0 && offsetY > 0) { options.withAspectRatio(offsetX, offsetY); } else { switch (copyMode) { case FunctionConfig.CROP_MODEL_DEFAULT: options.withAspectRatio(0, 0); break; case FunctionConfig.CROP_MODEL_1_1: options.withAspectRatio(1, 1); break; case FunctionConfig.CROP_MODEL_3_2: options.withAspectRatio(3, 2); break; case FunctionConfig.CROP_MODEL_3_4: options.withAspectRatio(3, 4); break; case FunctionConfig.CROP_MODEL_16_9: options.withAspectRatio(16, 9); break; } } // 圆形裁剪 if (circularCut) { options.setCircleDimmedLayer(true);// 是否为椭圆 options.setShowCropFrame(false);// 外部矩形 options.setShowCropGrid(false);// 内部网格 options.withAspectRatio(1, 1); } options.setFreeStyleCropEnabled(freeStyleCrop); options.setCompressionQuality(compressQuality); options.setFreeStyleCropEnabled(freeStyleCrop); options.withMaxResultSize(cropW, cropH); options.background_color(backgroundColor); options.localType(type); options.setLeftBackDrawable(leftDrawable); options.setIsCompress(isCompress); options.setIsTakePhoto(takePhoto); options.setTitleColor(title_color); options.setRightColor(right_color); options.setStatusBar(statusBar); options.setImmersiver(isImmersive); options.setRotateEnabled(rotateEnabled); options.setScaleEnabled(scaleEnabled); uCrop.withOptions(options); uCrop.start(PictureImageGridActivity.this); } /** * 多图裁剪 * * @param medias */ protected void startMultiCrop(List<LocalMedia> medias) { if (Utils.isFastDoubleClick()) { return; } // 这里解决一下 多图裁剪 快速点击确定时 事件会穿透到此activity取消按钮中来的奇葩问题,猜测应该是activity启动动画引起的 picture_tv_right.setEnabled(false); if (medias != null && medias.size() > 0) { LocalMedia media = medias.get(0); String path = media.getPath(); // 去裁剪 MultiUCrop uCrop = MultiUCrop.of(Uri.parse(path), Uri.fromFile(new File(getCacheDir(), System.currentTimeMillis() + ".jpg"))); MultiUCrop.Options options = new MultiUCrop.Options(); if (offsetX > 0 && offsetY > 0) { options.withAspectRatio(offsetX, offsetY); } else { switch (copyMode) { case FunctionConfig.CROP_MODEL_DEFAULT: options.withAspectRatio(0, 0); break; case FunctionConfig.CROP_MODEL_1_1: options.withAspectRatio(1, 1); break; case FunctionConfig.CROP_MODEL_3_2: options.withAspectRatio(3, 2); break; case FunctionConfig.CROP_MODEL_3_4: options.withAspectRatio(3, 4); break; case FunctionConfig.CROP_MODEL_16_9: options.withAspectRatio(16, 9); break; } } // 圆形裁剪 if (circularCut) { options.setCircleDimmedLayer(true);// 是否为椭圆 options.setShowCropFrame(false);// 外部矩形 options.setShowCropGrid(false);// 内部网格 options.withAspectRatio(1, 1); } options.setFreeStyleCropEnabled(freeStyleCrop); options.setLocalMedia(medias); options.setCompressionQuality(compressQuality); options.withMaxResultSize(cropW, cropH); options.background_color(backgroundColor); options.setLeftBackDrawable(leftDrawable); options.setIsCompress(isCompress); options.setCircularCut(circularCut); options.setTitleColor(title_color); options.setRightColor(right_color); options.copyMode(copyMode); options.setImmersiver(isImmersive); options.setStatusBar(statusBar); options.setRotateEnabled(rotateEnabled); options.setScaleEnabled(scaleEnabled); uCrop.withOptions(options); uCrop.start(PictureImageGridActivity.this); } } /** * start to camera、preview、crop */ public void startOpenCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (cameraIntent.resolveActivity(getPackageManager()) != null) { File cameraFile = FileUtils.createCameraFile(this, type); cameraPath = cameraFile.getAbsolutePath(); Uri imageUri; String authority = getPackageName() + ".provider"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { imageUri = FileProvider.getUriForFile(mContext, authority, cameraFile);//通过FileProvider创建一个content类型的Uri } else { imageUri = Uri.fromFile(cameraFile); } cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(cameraIntent, FunctionConfig.REQUEST_CAMERA); } } /** * start to camera、video */ public void startOpenCameraVideo() { Intent cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); if (cameraIntent.resolveActivity(getPackageManager()) != null) { File cameraFile = FileUtils.createCameraFile(this, type); cameraPath = cameraFile.getAbsolutePath(); Uri imageUri; String authority = getPackageName() + ".provider"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { imageUri = FileProvider.getUriForFile(mContext, authority, cameraFile);//通过FileProvider创建一个content类型的Uri } else { imageUri = Uri.fromFile(cameraFile); } cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); cameraIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, recordVideoSecond); //cameraIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 5491520L);//5*1048*1048=5MB cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, definition); startActivityForResult(cameraIntent, FunctionConfig.REQUEST_CAMERA); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { // on take photo success if (requestCode == FunctionConfig.REQUEST_CAMERA) { // 拍照返回 File file = new File(cameraPath); int degree = FileUtils.readPictureDegree(file.getAbsolutePath()); rotateImage(degree, file); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); takePhotoSuccess = true; // 生成新拍照片或视频对象 LocalMedia media = new LocalMedia(); media.setPath(cameraPath); media.setType(type); List<LocalMedia> result; // 因为加入了单独拍照功能,所有如果是单独拍照的话也默认为单选状态 if (selectMode == FunctionConfig.MODE_SINGLE || takePhoto) { // 如果是单选 拍照后直接返回 if (type == FunctionConfig.TYPE_IMAGE) { if (enableCrop) { // 去裁剪 startCrop(cameraPath); } else if (isCompress) { // 去压缩 result = new ArrayList<>(); result.add(media); compressImage(result); } else { // 不裁剪 不压缩 直接返回结果 result = new ArrayList<>(); result.add(media); onSelectDone(result); } } else { // 视频 result = new ArrayList<>(); MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(cameraPath); long duration = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); media.setDuration(duration); result.add(media); onSelectDone(result); } } else { // 多选 返回列表并选中当前拍照的 int duration = 0; if (type == FunctionConfig.TYPE_VIDEO) { MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(file.getPath()); duration = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); } createNewFolder(folders); // 生成拍照图片对象 media = new LocalMedia(file.getPath(), duration, duration, type); // 根据新拍照生成的图片,插入到对应的相册当中,避免重新查询一遍数据库 LocalMediaFolder folder = getImageFolder(media.getPath(), folders); // 更新当前图片所属文件夹 folder.getImages().add(0, media);// 插入到第一个位置 folder.setImageNum(folder.getImageNum() + 1); folder.setFirstImagePath(media.getPath()); folder.setType(type); // 取出最近文件夹 插入刚拍的照片或视频,并且如果大于100张,先移除最后一条在保存,因为最近文件夹中只显示100条数据 LocalMediaFolder mediaFolder = folders.get(0); mediaFolder.setFirstImagePath(media.getPath()); mediaFolder.setType(type); List<LocalMedia> localMedias = mediaFolder.getImages(); if (localMedias.size() >= 100) { localMedias.remove(localMedias.size() - 1); } List<LocalMedia> images = adapter.getImages(); images.add(0, media);// 将新拍的相片,放在图片列表第一位 mediaFolder.setImages(images); mediaFolder.setImageNum(mediaFolder.getImages().size()); Log.i(mediaFolder.getName() + "::", mediaFolder.getImages().size() + ""); // 没有到最大选择量 才做默认选中刚拍好的 if (adapter != null) { if (adapter.getSelectedImages().size() < maxSelectNum) { List<LocalMedia> selectedImages = adapter.getSelectedImages(); selectedImages.add(media); adapter.bindSelectImages(selectedImages); ChangeImageNumber(adapter.getSelectedImages()); } adapter.bindImagesData(images); } } } } else if (resultCode == RESULT_CANCELED) { // 取消拍照 if (takePhoto && !takePhotoSuccess) { recycleCallBack(); } } } /** * 判断拍照 图片是否旋转 * * @param degree * @param file */ private void rotateImage(int degree, File file) { if (degree > 0) { // 针对相片有旋转问题的处理方式 try { BitmapFactory.Options opts = new BitmapFactory.Options();//获取缩略图显示到屏幕上 opts.inSampleSize = 2; Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), opts); Bitmap bmp = FileUtils.rotaingImageView(degree, bitmap); FileUtils.saveBitmapFile(bmp, file); } catch (Exception e) { e.printStackTrace(); } } } /** * 释放 */ private void recycleCallBack() { activityFinish(2); clearData(); } /** * 如果没有任何相册,先创建一个最近相册出来 * * @param folders */ private void createNewFolder(List<LocalMediaFolder> folders) { if (folders.size() == 0) { // 没有相册 先创建一个最近相册出来 LocalMediaFolder newFolder = new LocalMediaFolder(); String folderName = ""; switch (type) { case FunctionConfig.TYPE_IMAGE: folderName = getString(R.string.picture_lately_image); break; case FunctionConfig.TYPE_VIDEO: folderName = getString(R.string.picture_lately_video); break; } newFolder.setName(folderName); newFolder.setPath(""); newFolder.setFirstImagePath(""); newFolder.setType(type); folders.add(newFolder); } } private void handleCropResult(List<LocalMedia> result) { if (result != null) { if (isCompress && type == FunctionConfig.TYPE_IMAGE) { // 压缩图片 compressImage(result); } else { onSelectDone(result); } } } public void onSelectDone(List<LocalMedia> result) { onResult(result); } public void onResult(List<LocalMedia> images) { // 因为这里是单一实例的结果集,重新用变量接收一下在返回,不然会产生结果集被单一实例清空的问题 List<LocalMedia> result = new ArrayList<>(); for (LocalMedia media : images) { result.add(media); } PictureConfig.OnSelectResultCallback resultCallback = PictureConfig.getResultCallback(); if (resultCallback != null) { switch (selectMode) { case FunctionConfig.MODE_SINGLE: // 单选 if (result.size() > 0) { resultCallback.onSelectSuccess(result.get(0)); } break; case FunctionConfig.MODE_MULTIPLE: // 多选 resultCallback.onSelectSuccess(result); break; } releaseCallBack(); } else { } EventEntity obj = new EventEntity(FunctionConfig.CLOSE_FLAG); RxBus.getDefault().post(obj); if ((takePhoto && takePhotoSuccess) || (enableCrop && isCompress && selectMode == FunctionConfig.MODE_SINGLE)) { // 如果是单独拍照并且压缩可能会造成还在压缩中,但此activity已关闭,或单选 裁剪压缩时等压缩完在关闭PictureSingeUCropActivity recycleCallBack(); releaseCallBack(); EventEntity obj1 = new EventEntity(FunctionConfig.CLOSE_SINE_CROP_FLAG); RxBus.getDefault().post(obj1); } else { clearData(); } finish(); overridePendingTransition(0, R.anim.slide_bottom_out); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putString(FunctionConfig.BUNDLE_CAMERA_PATH, cameraPath); outState.putBoolean(FunctionConfig.FUNCTION_TAKE, takePhoto); outState.putBoolean(FunctionConfig.TAKE_PHOTO_SUCCESS, takePhotoSuccess); outState.putSerializable(FunctionConfig.EXTRA_THIS_CONFIG, options); } private LocalMediaFolder getImageFolder(String path, List<LocalMediaFolder> imageFolders) { File imageFile = new File(path); File folderFile = imageFile.getParentFile(); for (LocalMediaFolder folder : imageFolders) { if (folder.getName().equals(folderFile.getName())) { return folder; } } LocalMediaFolder newFolder = new LocalMediaFolder(); newFolder.setName(folderFile.getName()); newFolder.setPath(folderFile.getAbsolutePath()); newFolder.setFirstImagePath(path); imageFolders.add(newFolder); return newFolder; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: activityFinish(1); return false; } return super.onKeyDown(keyCode, event); } private void activityFinish(int type) { switch (type) { case 1: // 返回 if (adapter != null) { List<LocalMedia> selectedImages = adapter.getSelectedImages(); // 这里使用Activity启动模式singleTask,所以启动过该activity 刚不会重复启动 startActivity(new Intent(mContext, PictureAlbumDirectoryActivity.class).putExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) selectedImages).putExtra(FunctionConfig.EXTRA_THIS_CONFIG, options)); overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out); ImagesObservable.getInstance().notifySelectLocalMediaObserver(selectedImages); } else { releaseCallBack(); } finish(); break; case 2: // 取消 clearData(); EventEntity obj = new EventEntity(FunctionConfig.CLOSE_FLAG); RxBus.getDefault().post(obj); finish(); overridePendingTransition(0, R.anim.slide_bottom_out); break; } } /** * 处理图片压缩 */ private void compressImage(final List<LocalMedia> result) { showPleaseDialog(getString(R.string.picture_please)); CompressConfig compress_config = CompressConfig.ofDefaultConfig(); switch (compressFlag) { case 1: // 系统自带压缩 compress_config.enablePixelCompress(options.isEnablePixelCompress()); compress_config.enableQualityCompress(options.isEnableQualityCompress()); compress_config.setMaxSize(maxB); break; case 2: // luban压缩 LubanOptions option = new LubanOptions.Builder() .setMaxHeight(compressH) .setMaxWidth(compressW) .setMaxSize(maxB) .setGrade(grade) .create(); compress_config = CompressConfig.ofLuban(option); break; } CompressImageOptions.compress(this, compress_config, result, new CompressInterface.CompressListener() { @Override public void onCompressSuccess(List<LocalMedia> images) { // 压缩成功回调 onResult(images); dismiss(); } @Override public void onCompressError(List<LocalMedia> images, String msg) { // 压缩失败回调 返回原图 List<LocalMedia> selectedImages; if (takePhoto) { // 单独拍照的情况下是没有初始化adapter的,直接返回原图 selectedImages = result; } else { selectedImages = adapter.getSelectedImages(); } if (selectedImages != null) { onResult(selectedImages); } dismiss(); } }).compress(); } private void showPleaseDialog(String msg) { if (!isFinishing()) { dialog = new SweetAlertDialog(PictureImageGridActivity.this); dialog.setTitleText(msg); dialog.show(); } } private void dismiss() { if (dialog != null && dialog.isShowing()) { dialog.cancel(); } } /** * 释放静态 */ protected void clearData() { ImagesObservable.getInstance().clearLocalFolders(); ImagesObservable.getInstance().clearLocalMedia(); ImagesObservable.getInstance().clearSelectedLocalMedia(); } /** * 释放回调 导致的内存泄漏 */ protected void releaseCallBack() { PictureConfig.resultCallback = null; } @Override protected void onDestroy() { super.onDestroy(); if (RxBus.getDefault().isRegistered(this)) { RxBus.getDefault().unregister(this); } if (animation != null) { animation.cancel(); animation = null; } if (soundPool != null) { soundPool.stop(soundID); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } }