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;
|
}
|
}
|