package com.demo.lib.common.util.ui; import android.annotation.TargetApi; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.FileUtils; import android.provider.MediaStore; import android.webkit.MimeTypeMap; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import androidx.core.content.FileProvider; /** * 系统裁剪图片工具类 */ public class SystemClipImageUtil { /** * 剪切图片,兼容android10以上的版本, * 注意:需要AndroidManifest中需要配置FileProvider * @param context * @param uri 原图uri * @param name 图片名称 * @param width 剪切后的宽 * @param height 剪切后的高 * @param requestCode 请求码 * @return */ public static Uri startPhotoZoom(Activity context, Uri uri, String name, int width, int height, int requestCode) { if (uri == null) { return null; } File cropPhoto = new File(context.getExternalCacheDir(), name); //m_ResultImagePath = CropPhoto.getPath(); Uri mPhotoUri = Uri.fromFile(cropPhoto); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { cropPhoto = uriToFileApiQ(uri, context); mPhotoUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", cropPhoto); } String headPath = cropPhoto.getPath(); Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { intent.setDataAndType(mPhotoUri, "image/*"); } else { intent.setDataAndType(uri, "image/*"); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件 } intent.putExtra("crop", "true"); intent.putExtra("scale", true); if (Build.MANUFACTURER.equals("HUAWEI")) { intent.putExtra("aspectX", 9998); intent.putExtra("aspectY", 9999); } else { intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); } intent.putExtra("outputX", width); intent.putExtra("outputY", height); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); //intent.putExtra("noFaceDetection", true); // no face detection try { context.startActivityForResult(intent, requestCode);//这里的RESULT_REQUEST_CODE是在startActivityForResult里使用的返回值。 } catch (Exception e) { // 解决截取后部分机型秒退 e.printStackTrace(); } return mPhotoUri; } @TargetApi(Build.VERSION_CODES.Q) private static File uriToFileApiQ(Uri uri, Context context) { File file = null; if (uri == null) return file; //android10以上转换 if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) { file = new File(uri.getPath()); } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { //把文件复制到沙盒目录 ContentResolver contentResolver = context.getContentResolver(); String displayName = System.currentTimeMillis() + Math.round((Math.random() + 1) * 1000) + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri)); // 注释掉的方法可以获取到原文件的文件名,但是比较耗时 // Cursor cursor = contentResolver.query(uri, null, null, null, null); // if (cursor.moveToFirst()) { // String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));} try { InputStream is = contentResolver.openInputStream(uri); File cache = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath(), displayName); FileOutputStream fos = new FileOutputStream(cache); FileUtils.copy(is, fos); file = cache; fos.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } return file; } }