package com.lcjian.library.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import android.app.Activity; import android.content.Context; 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 androidx.fragment.app.Fragment; public class ImageChooseHelper { private static final int REQUEST_CODE_GET = 0; private static final int REQUEST_CODE_CAPTURE = 1; private static final int REQUEST_CODE_CROP = 2; private static final int REQUEST_CODE_CAPTURE_ORIGIN = 3; private Activity mActivity; private Fragment mFragment; private Context mContext; private boolean mNeedCrop; private Callback mCallback; public interface Callback { public void onResult(Bitmap bitmap, String path); public void onError(); } public static ImageChooseHelper create(Activity activity, boolean needCrop, Callback callback) { return new ImageChooseHelper(activity, needCrop, callback); } public static ImageChooseHelper create(Fragment fragment, boolean needCrop, Callback callback) { return new ImageChooseHelper(fragment, needCrop, callback); } private ImageChooseHelper(Activity activity, boolean needCrop, Callback callback) { this.mActivity = activity; this.mContext = activity; this.mNeedCrop = needCrop; this.mCallback = callback; } private ImageChooseHelper(Fragment fragment, boolean needCrop, Callback callback) { this.mFragment = fragment; this.mContext = fragment.getActivity(); this.mNeedCrop = needCrop; this.mCallback = callback; } public void startActivityGet() { /*** * 这个是调用android内置的intent,来过滤图片文件,同时也可以过滤其他的 */ Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); if (mActivity == null) { mFragment.startActivityForResult(intent, REQUEST_CODE_GET); } else { mActivity.startActivityForResult(intent, REQUEST_CODE_GET); } } public void startActivityCapture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (mActivity == null) { mFragment.startActivityForResult(intent, REQUEST_CODE_CAPTURE); } else { mActivity.startActivityForResult(intent, REQUEST_CODE_CAPTURE); } } private Uri mUri; public void startActivityCaptureOrigin() { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String name = new SimpleDateFormat("yyyyMMddhhmmss", Locale.CHINA).format(new Date()) + ".jpg"; mUri = Uri.fromFile(new File(mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES), name)); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0); intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri); if (mActivity == null) { mFragment.startActivityForResult(intent, REQUEST_CODE_CAPTURE_ORIGIN); } else { mActivity.startActivityForResult(intent, REQUEST_CODE_CAPTURE_ORIGIN); } } } private void startCrop(Uri uri, int size) { 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", size); intent.putExtra("outputY", size); intent.putExtra("return-data", true); if (mActivity == null) { mFragment.startActivityForResult(intent, REQUEST_CODE_CROP); } else { mActivity.startActivityForResult(intent, REQUEST_CODE_CROP); } } public void handleActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case REQUEST_CODE_GET: { if (mNeedCrop) { startCrop(data.getData(), 150); } else { /** * 当选择的图片不为空的话,在获取到图片的途径 */ Uri uri = data.getData(); String[] pojo = { MediaStore.Images.Media.DATA }; Cursor cursor = mContext.getContentResolver().query(uri, pojo, null, null, null); if (cursor != null) { int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(colunm_index); mCallback.onResult(null, path); } else { mCallback.onError(); } cursor.close(); } } break; case REQUEST_CODE_CAPTURE: if (mNeedCrop) { Bitmap bitmap = (Bitmap) data.getExtras().get("data"); startCrop(Uri.fromFile(new File(saveBitmap(bitmap))), 150); } else { mCallback.onResult((Bitmap) data.getExtras().getParcelable("data"), null); } break; case REQUEST_CODE_CAPTURE_ORIGIN: if (mNeedCrop) { startCrop(mUri, 150); } else { mCallback.onResult(null, mUri.getPath()); } break; case REQUEST_CODE_CROP: mCallback.onResult((Bitmap) data.getExtras().getParcelable("data"), null); break; default: break; } } } public String saveBitmap(Bitmap bitmap) { String name = new SimpleDateFormat("yyyyMMddhhmmss", Locale.CHINA).format(new Date()); String fileNmae; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { fileNmae = mContext.getExternalFilesDir(null) + File.separator + "save/" + name + ".jpg"; } else { fileNmae = mContext.getFilesDir() + File.separator + "save/" + name + ".jpg"; } File myCaptureFile = new File(fileNmae); if (!myCaptureFile.getParentFile().exists()) { myCaptureFile.getParentFile().mkdirs(); } FileOutputStream fis = null; try { fis = new FileOutputStream(myCaptureFile); BufferedOutputStream bos = new BufferedOutputStream(fis); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); try { bos.flush(); } catch (IOException e) { fileNmae = null; e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } catch (FileNotFoundException e) { fileNmae = null; e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } return fileNmae; } }