323 lines
11 KiB
Java
323 lines
11 KiB
Java
package com.yunbao.common.utils;
|
|
|
|
import android.Manifest;
|
|
import android.content.ContentUris;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.database.Cursor;
|
|
import android.net.Uri;
|
|
import android.os.Build;
|
|
import android.provider.DocumentsContract;
|
|
import android.provider.MediaStore;
|
|
|
|
import androidx.fragment.app.FragmentActivity;
|
|
import androidx.core.content.FileProvider;
|
|
|
|
import com.yalantis.ucrop.UCrop;
|
|
import com.yunbao.common.CommonAppConfig;
|
|
import com.yunbao.common.R;
|
|
import com.yunbao.common.interfaces.ActivityResultCallback;
|
|
import com.yunbao.common.interfaces.ImageResultCallback;
|
|
|
|
import java.io.File;
|
|
|
|
/**
|
|
* Created by cxf on 2018/9/29.
|
|
* 选择图片 裁剪
|
|
*/
|
|
|
|
public class ProcessImageUtil extends ProcessResultUtil {
|
|
|
|
private Context mContext;
|
|
private String[] mCameraPermissions;
|
|
private String[] mAlumbPermissions;
|
|
private Runnable mCameraPermissionCallback;
|
|
private Runnable mAlumbPermissionCallback;
|
|
private ActivityResultCallback mCameraResultCallback;
|
|
private ActivityResultCallback mAlumbResultCallback;
|
|
private ActivityResultCallback mCropResultCallback;
|
|
private File mCameraResult;//拍照后得到的图片
|
|
private File mCorpResult;//裁剪后得到的图片
|
|
private ImageResultCallback mResultCallback;
|
|
private boolean mNeedCrop;//是否需要裁剪
|
|
private String authority = "com.pdlive.shayu.fileprovider";
|
|
|
|
public ProcessImageUtil(FragmentActivity activity, String authority) {
|
|
super(activity);
|
|
this.authority = authority;
|
|
init(activity);
|
|
}
|
|
|
|
public ProcessImageUtil(FragmentActivity activity) {
|
|
super(activity);
|
|
init(activity);
|
|
}
|
|
|
|
private void init(FragmentActivity activity) {
|
|
mContext = activity;
|
|
mCameraPermissions = new String[]{
|
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
|
Manifest.permission.CAMERA
|
|
};
|
|
mAlumbPermissions = new String[]{
|
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
|
};
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
mCameraPermissions = new String[]{
|
|
Manifest.permission.READ_MEDIA_IMAGES,
|
|
Manifest.permission.CAMERA
|
|
};
|
|
mAlumbPermissions = new String[]{
|
|
Manifest.permission.READ_MEDIA_IMAGES,
|
|
};
|
|
}
|
|
mCameraPermissionCallback = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
takePhoto();
|
|
}
|
|
};
|
|
mAlumbPermissionCallback = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
chooseFile();
|
|
}
|
|
};
|
|
mCameraResultCallback = new ActivityResultCallback() {
|
|
@Override
|
|
public void onSuccess(Intent intent) {
|
|
if (mNeedCrop) {
|
|
Uri uri = null;
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
|
uri = FileProvider.getUriForFile(mContext, authority, mCameraResult);
|
|
} else {
|
|
uri = Uri.fromFile(mCameraResult);
|
|
}
|
|
if (uri != null) {
|
|
crop(uri);
|
|
}
|
|
} else {
|
|
if (mResultCallback != null) {
|
|
mResultCallback.onSuccess(mCameraResult);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onFailure() {
|
|
ToastUtil.show(R.string.img_camera_cancel);
|
|
}
|
|
};
|
|
mAlumbResultCallback = new ActivityResultCallback() {
|
|
@Override
|
|
public void onSuccess(Intent intent) {
|
|
if (mNeedCrop) {
|
|
crop(intent.getData());
|
|
} else {
|
|
mResultCallback.onSuccess(new File(getFilePathForUri(mContext,intent.getData())));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onFailure() {
|
|
ToastUtil.show(R.string.img_alumb_cancel);
|
|
}
|
|
};
|
|
mCropResultCallback = new ActivityResultCallback() {
|
|
@Override
|
|
public void onSuccess(Intent intent) {
|
|
if (mResultCallback != null) {
|
|
mResultCallback.onSuccess(mCorpResult);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onFailure() {
|
|
ToastUtil.show(R.string.img_crop_cancel);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 拍照获取图片
|
|
*/
|
|
public void getImageByCamera(boolean needCrop) {
|
|
mNeedCrop = needCrop;
|
|
requestPermissions(mCameraPermissions, mCameraPermissionCallback);
|
|
}
|
|
|
|
/**
|
|
* 拍照获取图片
|
|
*/
|
|
public void getImageByCamera() {
|
|
getImageByCamera(true);
|
|
}
|
|
|
|
/**
|
|
* 相册获取图片
|
|
*/
|
|
public void getImageByAlumb() {
|
|
getImageByAlumb(true);
|
|
}
|
|
|
|
public void getImageByAlumb(boolean needCrop) {
|
|
mNeedCrop = needCrop;
|
|
requestPermissions(mAlumbPermissions, mAlumbPermissionCallback);
|
|
}
|
|
|
|
/**
|
|
* 开启摄像头,执行照相
|
|
*/
|
|
private void takePhoto() {
|
|
try {
|
|
if (mResultCallback != null) {
|
|
mResultCallback.beforeCamera();
|
|
}
|
|
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
|
mCameraResult = getNewFile();
|
|
Uri uri = null;
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
|
uri = FileProvider.getUriForFile(mContext, authority, mCameraResult);
|
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
} else {
|
|
uri = Uri.fromFile(mCameraResult);
|
|
}
|
|
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
|
|
startActivityForResult(intent, mCameraResultCallback);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private File getNewFile() {
|
|
// 裁剪头像的绝对路径
|
|
File dir = new File(CommonAppConfig.CAMERA_IMAGE_PATH);
|
|
if (!dir.exists()) {
|
|
dir.mkdirs();
|
|
}
|
|
return new File(dir, DateFormatUtil.getCurTimeString() + ".png");
|
|
}
|
|
|
|
|
|
/**
|
|
* 打开相册,选择文件
|
|
*/
|
|
private void chooseFile() {
|
|
Intent intent = new Intent();
|
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
|
intent.setType("image/*");
|
|
if (Build.VERSION.SDK_INT < 19) {
|
|
intent.setAction(Intent.ACTION_GET_CONTENT);
|
|
} else {
|
|
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
|
|
}
|
|
startActivityForResult(intent, mAlumbResultCallback);
|
|
}
|
|
|
|
/**
|
|
* 裁剪
|
|
*/
|
|
private void crop(Uri inputUri) {
|
|
mCorpResult = getNewFile();
|
|
try {
|
|
Uri resultUri = Uri.fromFile(mCorpResult);
|
|
if (resultUri == null || mFragment == null || mContext == null) {
|
|
return;
|
|
}
|
|
UCrop uCrop = UCrop.of(inputUri, resultUri)
|
|
.withAspectRatio(1, 1)
|
|
.withMaxResultSize(400, 400);
|
|
Intent intent = uCrop.getIntent(mContext);
|
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
startActivityForResult(intent, mCropResultCallback);
|
|
} catch (Exception e) {
|
|
try {
|
|
Uri resultUri = FileProvider.getUriForFile(mContext, authority, mCorpResult);
|
|
if (resultUri == null || mFragment == null || mContext == null) {
|
|
return;
|
|
}
|
|
UCrop uCrop = UCrop.of(inputUri, resultUri)
|
|
.withAspectRatio(1, 1)
|
|
.withMaxResultSize(400, 400);
|
|
Intent intent = uCrop.getIntent(mContext);
|
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
startActivityForResult(intent, mCropResultCallback);
|
|
} catch (Exception e1) {
|
|
e1.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public void setImageResultCallback(ImageResultCallback resultCallback) {
|
|
mResultCallback = resultCallback;
|
|
}
|
|
|
|
private static String getFilePathForUri(Context context, Uri uri) {
|
|
String filePath = null;
|
|
if (DocumentsContract.isDocumentUri(context, uri)) {
|
|
// 如果是document类型的 uri, 则通过document id来进行处理
|
|
String documentId = DocumentsContract.getDocumentId(uri);
|
|
if (isMediaDocument(uri)) { // MediaProvider
|
|
// 使用':'分割
|
|
String id = documentId.split(":")[1];
|
|
String selection = MediaStore.Images.Media._ID + "=?";
|
|
String[] selectionArgs = {id};
|
|
filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
|
|
} else if (isDownloadsDocument(uri)) { // DownloadsProvider
|
|
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
|
|
filePath = getDataColumn(context, contentUri, null, null);
|
|
}
|
|
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
|
|
// 如果是 content 类型的 Uri
|
|
filePath = getDataColumn(context, uri, null, null);
|
|
} else if ("file".equals(uri.getScheme())) {
|
|
// 如果是 file 类型的 Uri,直接获取图片对应的路径
|
|
filePath = uri.getPath();
|
|
}
|
|
return filePath;
|
|
}
|
|
|
|
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
|
|
String path = null;
|
|
String[] projection = new String[]{MediaStore.Images.Media.DATA};
|
|
Cursor cursor = null;
|
|
try {
|
|
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
|
|
if (cursor != null && cursor.moveToFirst()) {
|
|
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
|
|
path = cursor.getString(columnIndex);
|
|
}
|
|
} catch (Exception e) {
|
|
if (cursor != null) {
|
|
cursor.close();
|
|
}
|
|
}
|
|
return path;
|
|
}
|
|
|
|
/**
|
|
* @param uri the Uri to check
|
|
* @return Whether the Uri authority is MediaProvider
|
|
*/
|
|
private static boolean isMediaDocument(Uri uri) {
|
|
return "com.android.providers.media.documents".equals(uri.getAuthority());
|
|
}
|
|
|
|
/**
|
|
* @param uri the Uri to check
|
|
* @return Whether the Uri authority is DownloadsProvider
|
|
*/
|
|
private static boolean isDownloadsDocument(Uri uri) {
|
|
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
|
|
}
|
|
|
|
@Override
|
|
public void release() {
|
|
super.release();
|
|
mResultCallback = null;
|
|
}
|
|
}
|