package com.ysvideo.zhibo.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;
|
}
|
|
|
}
|