2022-09-21 18:31:07 +08:00

578 lines
18 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.yunbao.faceunity.utils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.media.ExifInterface;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.regex.Pattern;
/**
* DESC
* Created on 2021/3/12
*/
public class FileUtils {
public static final String DCIM_FILE_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
public static final String photoFilePath;
public static final String videoFilePath;
public static final String exportVideoDir;
static {
if (Build.FINGERPRINT.contains("Flyme")
|| Pattern.compile("Flyme", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find()
|| Build.MANUFACTURER.contains("Meizu")
|| Build.MANUFACTURER.contains("MeiZu")) {
photoFilePath = DCIM_FILE_PATH + File.separator + "Camera" + File.separator;
videoFilePath = DCIM_FILE_PATH + File.separator + "Video" + File.separator;
} else if (Build.FINGERPRINT.contains("vivo")
|| Pattern.compile("vivo", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find()
|| Build.MANUFACTURER.contains("vivo")
|| Build.MANUFACTURER.contains("Vivo")) {
photoFilePath = videoFilePath = Environment.getExternalStoragePublicDirectory("") + File.separator + "相机" + File.separator;
} else {
photoFilePath = videoFilePath = DCIM_FILE_PATH + File.separator + "Camera" + File.separator;
}
exportVideoDir = DCIM_FILE_PATH + File.separator + "FaceUnity" + File.separator;
createFileDir(photoFilePath);
createFileDir(videoFilePath);
createFileDir(exportVideoDir);
}
public static final String IMAGE_FORMAT_JPG = ".jpg";
public static final String IMAGE_FORMAT_JPEG = ".jpeg";
public static final String IMAGE_FORMAT_PNG = ".png";
public static final String VIDEO_FORMAT_MP4 = ".mp4";
/**
* 创建文件夹
*
* @param path
*/
public static void createFileDir(String path) {
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
}
/**
* 应用外部文件目录
*
* @return
*/
public static File getExternalFileDir(Context context) {
File fileDir = context.getFilesDir();
return fileDir;
}
/**
* 应用下缓存文件目录
*
* @return
*/
public static File getCacheFileDir(Context context) {
File fileDir = context.getCacheDir();
if (fileDir == null) {
fileDir = context.getFilesDir();
}
return fileDir;
}
/**
* 获取当前时间日期
*
* @return
*/
public static String getDateTimeString() {
GregorianCalendar now = new GregorianCalendar();
return new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.US).format(now.getTime());
}
/**
* 获取视频缓存文件
*
* @param context Context
* @return File
*/
public static File getCacheVideoFile(Context context) {
File fileDir = new File(getExternalFileDir(context).getPath() + File.separator + "video");
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(fileDir, getCurrentVideoFileName());
if (file.exists()) {
file.delete();
}
return file;
}
/**
* 构造视频文件名称
*
* @return
*/
public static String getCurrentVideoFileName() {
return getDateTimeString() + VIDEO_FORMAT_MP4;
}
/**
* 构造图片文件名称
*
* @return
*/
public static String getCurrentPhotoFileName() {
return getDateTimeString() + IMAGE_FORMAT_JPG;
}
/**
* Bitmap保存到本地
*
* @param context Context
* @param bitmap Bitmap
* @return String?
*/
public static String addBitmapToExternal(Context context, Bitmap bitmap) {
if (bitmap == null) return null;
File fileDir = new File(getExternalFileDir(context).getPath() + File.separator + "photo");
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(fileDir, getCurrentPhotoFileName());
if (file.exists()) {
file.delete();
}
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 将Bitmap文件保存到相册
*
* @param bitmap Bitmap
*/
public static String addBitmapToAlbum(Context context, Bitmap bitmap) {
if (bitmap == null) return null;
FileOutputStream fos = null;
File dcimFile;
File fileDir = new File(exportVideoDir);
if (fileDir.exists()) {
dcimFile = new File(exportVideoDir, getCurrentPhotoFileName());
} else {
dcimFile = new File(photoFilePath, getCurrentPhotoFileName());
}
if (dcimFile.exists()) {
dcimFile.delete();
}
try {
fos = new FileOutputStream(dcimFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(dcimFile)));
return dcimFile.getAbsolutePath();
}
/**
* 将视频文件保存到相册
*
* @param videoFile File
* @return Uri?
*/
public static String addVideoToAlbum(Context context, File videoFile) {
if (videoFile == null) return null;
File fileDir = new File(exportVideoDir);
File dcimFile;
if (fileDir.exists()) {
dcimFile = new File(exportVideoDir, getCurrentVideoFileName());
} else {
dcimFile = new File(videoFilePath, getCurrentVideoFileName());
}
if (dcimFile.exists()) {
dcimFile.delete();
}
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(videoFile));
bos = new BufferedOutputStream(new FileOutputStream(dcimFile));
byte[] bytes = new byte[1024 * 10];
int length;
while ((length = bis.read(bytes)) != -1) {
bos.write(bytes, 0, length);
}
bos.flush();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(dcimFile)));
return dcimFile.getAbsolutePath();
}
/**
* 将Assets文件拷贝到应用作用域存储
*
* @param context Context
* @param assetsPath String
* @param fileName String
*/
public static String copyAssetsToExternalFilesDir(Context context, String assetsPath, String fileName) {
File fileDir = new File(getExternalFileDir(context).getPath() + File.separator + "assets");
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(fileDir, fileName);
if (file.exists()) {
return file.getAbsolutePath();
}
try {
InputStream inputStream = context.getAssets().open(assetsPath);
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(inputStream);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] byteArray = new byte[1024];
int bytes = bis.read(byteArray);
while (bytes > 0) {
bos.write(byteArray, 0, bytes);
bos.flush();
bytes = bis.read(byteArray);
}
bos.close();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取Uri文件绝对路径
*
* @param context: Context
* @param uri Uri
* @return String
*/
public static String getFilePathByUri(Context context, Uri uri) {
if (uri == null) return null;
return Uri2PathUtil.getRealPathFromUri(context, uri);
}
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
String[] projection = new String[]{MediaStore.Images.Media.DATA};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
return cursor.getString(index);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return null;
}
/**
* load本地图片
*
* @param path
* @param screenWidth
* @return
*/
public static Bitmap loadBitmapFromExternal(String path, int screenWidth) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, opt);
int picWidth = opt.outWidth;
int picHeight = opt.outHeight;
opt.inSampleSize = 1;
// 根据屏的大小和图片大小计算出缩放比例
if (picWidth > picHeight) {
if (picHeight > screenWidth) {
opt.inSampleSize = picHeight / screenWidth;
}
} else {
if (picWidth > screenWidth) {
opt.inSampleSize = picWidth / screenWidth;
}
}
opt.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, opt);
int orientation = getPhotoOrientation(path);
bitmap = rotateBitmap(bitmap, orientation);
return bitmap;
}
/**
* load本地图片
*
* @param path String
* @param screenWidth Int
* @param screenHeight Int
* @return Bitmap
*/
public static Bitmap loadBitmapFromExternal(String path, int screenWidth, int screenHeight) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, opt);
int picWidth = opt.outWidth;
int picHeight = opt.outHeight;
int inSampleSize = 1;
// 根据屏的大小和图片大小计算出缩放比例
if (picHeight > screenHeight || picWidth > screenWidth) {
int halfHeight = picHeight / 2;
int halfWidth = picWidth / 2;
while (halfHeight / inSampleSize >= screenHeight && halfWidth / inSampleSize >= screenWidth) {
inSampleSize *= 2;
}
}
opt.inSampleSize = inSampleSize;
opt.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, opt);
int orientation = getPhotoOrientation(path);
bitmap = rotateBitmap(bitmap, orientation);
return bitmap;
}
/**
* 旋转 Bitmap
*
* @param bitmap
* @param orientation
* @return
*/
private static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {
if (orientation == 90 || orientation == 180 || orientation == 270) {
Matrix matrix = new Matrix();
matrix.postRotate((float) orientation);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
return bitmap;
}
/**
* 获取图片的方向
*
* @param path
* @return
*/
public static int getPhotoOrientation(String path) {
int orientation = 0;
int tagOrientation = 0;
try {
tagOrientation = new ExifInterface(path).getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
} catch (IOException e) {
e.printStackTrace();
}
switch (tagOrientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
orientation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
orientation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
orientation = 270;
break;
}
return orientation;
}
/**
* 选中图片
*
* @param activity Activity
*/
public static void pickImageFile(Activity activity, int requestCode) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
activity.startActivityForResult(intent, requestCode);
}
/**
* 选中视频
*
* @param activity Activity
* 回调可参考下方
*/
public static void pickVideoFile(Activity activity, int requestCode) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("video/*");
activity.startActivityForResult(intent, requestCode);
}
/**
* 根据路径获取InputStream
*
* @param context Context
* @param path String
* @return InputStream?
*/
public static InputStream readInputStreamByPath(Context context, String path) {
if (path == null || path.trim().length() == 0)
return null;
InputStream inputStream = null;
try {
inputStream = context.getAssets().open(path);
} catch (IOException e1) {
try {
inputStream = new FileInputStream(path);
} catch (IOException e2) {
e2.printStackTrace();
}
}
return inputStream;
}
/**
* 相机byte转bitmap
*
* @param buffer
* @param width
* @param height
* @return
*/
public static Bitmap bytes2Bitmap(byte[] buffer, int width, int height) {
YuvImage yuvimage = new YuvImage(buffer, ImageFormat.NV21, width, height, null);//20、20分别是图的宽度与高度
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, width, height), 80, baos);//80--JPG图片的质量[0-100],100最高
byte[] jdata = baos.toByteArray();
return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, jdata.length);
}
/**
* 遍历一个文件夹获取改文件夹下所有文件名
* @param path
* @return
*/
public static ArrayList<String> getFileList(String path) {
ArrayList<String> fileList = new ArrayList<>();
File dir = new File(path);
// 该文件目录下文件全部放入数组
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
// 判断是文件还是文件夹
if (files[i].isDirectory()) {
// 获取文件绝对路径
getFileList(files[i].getAbsolutePath());
// 判断文件名是否以.jpg结尾
} else {
fileList.add(files[i].getName());
}
}
}
return fileList;
}
/**
* 校验文件是否是图片
*
* @param path String
* @return Boolean
*/
public static Boolean checkIsImage(String path) {
String name = new File(path).getName().toLowerCase();
return (name.endsWith(IMAGE_FORMAT_PNG) || name.endsWith(IMAGE_FORMAT_JPG)
|| name.endsWith(IMAGE_FORMAT_JPEG));
}
/**
* 校验文件是否是视频
*
* @param path String
* @return Boolean
*/
public static Boolean checkIsVideo(Context context,String path) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(context, Uri.fromFile(new File(path)));
String hasVideo = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO);
return "yes".equals(hasVideo);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}