package cn.rongcloud.im.server.utils.photo; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.Interpolator; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import java.io.File; import java.util.List; import cn.rongcloud.im.server.utils.CommonUtils; /** * [从本地选择图片以及拍照工具类,完美适配2.0-5.0版本] * * @author huxinwu * @version 1.0 * @date 2015-1-7 **/ public class PhotoUtils { private final String tag = PhotoUtils.class.getSimpleName(); /** * 裁剪图片成功后返回 **/ public static final int INTENT_CROP = 2; /** * 拍照成功后返回 **/ public static final int INTENT_TAKE = 3; /** * 拍照成功后返回 **/ public static final int INTENT_SELECT = 4; public static final String CROP_FILE_NAME = "crop_file.jpg"; /** * PhotoUtils对象 **/ private OnPhotoResultListener onPhotoResultListener; public PhotoUtils(OnPhotoResultListener onPhotoResultListener) { this.onPhotoResultListener = onPhotoResultListener; } /** * 拍照 * * @param * @return */ public void takePicture(Activity activity) { try { //每次选择图片吧之前的图片删除 clearCropFile(buildUri(activity)); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, buildUri(activity)); if (!isIntentAvailable(activity, intent)) { return; } activity.startActivityForResult(intent, INTENT_TAKE); } catch (Exception e) { e.printStackTrace(); } } /*** * 选择一张图片 * 图片类型,这里是image/*,当然也可以设置限制 * 如:image/jpeg等 * * @param activity Activity */ @SuppressLint("InlinedApi") public void selectPicture(Activity activity) { try { //每次选择图片吧之前的图片删除 clearCropFile(buildUri(activity)); Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); if (!isIntentAvailable(activity, intent)) { return; } activity.startActivityForResult(intent, INTENT_SELECT); } catch (Exception e) { e.printStackTrace(); } } /** * 构建uri * * @param activity * @return */ private Uri buildUri(Activity activity) { if (CommonUtils.checkSDCard()) { return Uri.fromFile(Environment.getExternalStorageDirectory()).buildUpon().appendPath(CROP_FILE_NAME).build(); } else { return Uri.fromFile(activity.getCacheDir()).buildUpon().appendPath(CROP_FILE_NAME).build(); } } /** * @param intent * @return */ protected boolean isIntentAvailable(Activity activity, Intent intent) { PackageManager packageManager = activity.getPackageManager(); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } private boolean corp(Activity activity, Uri uri) { Intent cropIntent = new Intent("com.android.camera.action.CROP"); cropIntent.setDataAndType(uri, "image/*"); cropIntent.putExtra("crop", "true"); cropIntent.putExtra("aspectX", 1); cropIntent.putExtra("aspectY", 1); cropIntent.putExtra("outputX", 200); cropIntent.putExtra("outputY", 200); cropIntent.putExtra("return-data", false); cropIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); Uri cropuri = buildUri(activity); cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, cropuri); if (!isIntentAvailable(activity, cropIntent)) { return false; } else { try { activity.startActivityForResult(cropIntent, INTENT_CROP); return true; } catch (Exception e) { e.printStackTrace(); return false; } } } /** * 返回结果处理 * * @param requestCode * @param resultCode * @param data */ public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { if (onPhotoResultListener == null) { Log.e(tag, "onPhotoResultListener is not null"); return; } switch (requestCode) { //拍照 case INTENT_TAKE: if (new File(buildUri(activity).getPath()).exists()) { if (corp(activity, buildUri(activity))) { return; } onPhotoResultListener.onPhotoCancel(); } break; //选择图片 case INTENT_SELECT: if (data != null && data.getData() != null) { Uri imageUri = data.getData(); if (corp(activity, imageUri)) { return; } } onPhotoResultListener.onPhotoCancel(); break; //截图 case INTENT_CROP: if (resultCode == Activity.RESULT_OK && new File(buildUri(activity).getPath()).exists()) { onPhotoResultListener.onPhotoResult(buildUri(activity)); } break; } } /** * 删除文件 * * @param uri * @return */ public boolean clearCropFile(Uri uri) { if (uri == null) { return false; } File file = new File(uri.getPath()); if (file.exists()) { boolean result = file.delete(); if (result) { Log.i(tag, "Cached crop file cleared."); } else { Log.e(tag, "Failed to clear cached crop file."); } return result; } else { Log.w(tag, "Trying to clear cached crop file but it does not exist."); } return false; } /** * [回调监听类] * * @author huxinwu * @version 1.0 * @date 2015-1-7 **/ public interface OnPhotoResultListener { void onPhotoResult(Uri uri); void onPhotoCancel(); } public OnPhotoResultListener getOnPhotoResultListener() { return onPhotoResultListener; } public void setOnPhotoResultListener(OnPhotoResultListener onPhotoResultListener) { this.onPhotoResultListener = onPhotoResultListener; } }