//file:///storage/emulated/0/Android/data/包名/files/screenshots_videos//100000406127/pp_20220225201215.jpg
public static void saveFile2Gallery(Context context, boolean isVideo, Uri uri, String fileName) {
String folderName = "";
if (isVideo) {
folderName = Environment.DIRECTORY_DCIM + "/" + context.getString(R.string.android_app_name);
} else {
folderName = Environment.DIRECTORY_PICTURES + "/" + context.getString(R.string.android_app_name);
}
Uri uriSavedFile;
File createdFile = null;
ContentResolver resolver = context.getContentResolver();
ContentValues valuesFile;
valuesFile = new ContentValues();
if (Build.VERSION.SDK_INT >= 29) {
valuesFile.put(MediaStore.Video.Media.RELATIVE_PATH, folderName);
valuesFile.put(MediaStore.Video.Media.TITLE, fileName);
valuesFile.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
valuesFile.put(MediaStore.Video.Media.MIME_TYPE, isVideo? "video/mp4" : "image/jpeg");
valuesFile.put(
MediaStore.Video.Media.DATE_ADDED,
System.currentTimeMillis() / 1000);
Uri collection = isVideo? MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) :
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
uriSavedFile = resolver.insert(collection, valuesFile);
} else {
File directory = Environment.getExternalStoragePublicDirectory(isVideo? Environment.DIRECTORY_DCIM : Environment.DIRECTORY_PICTURES);
File parent = new File(directory.getAbsolutePath() + "/" + context.getString(R.string.android_app_name));
if (!parent.exists()) {
parent.mkdir();
}
createdFile = new File(parent, fileName + (isVideo? ".mp4" : ".jpg"));
valuesFile.put(MediaStore.Video.Media.TITLE, fileName);
valuesFile.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
valuesFile.put(MediaStore.Video.Media.MIME_TYPE, isVideo ? "video/mp4" : "image/jpeg");
valuesFile.put(
MediaStore.Video.Media.DATE_ADDED,
System.currentTimeMillis() / 1000);
valuesFile.put(MediaStore.Video.Media.DATA, createdFile.getAbsolutePath());
if (isVideo) {
uriSavedFile = context.getContentResolver().insert(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
valuesFile);
} else {
uriSavedFile = context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
valuesFile);
}
}
if (Build.VERSION.SDK_INT >= 29) {
valuesFile.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
valuesFile.put(MediaStore.Video.Media.IS_PENDING, 1);
}
try {
if (isVideo) {
ParcelFileDescriptor pfd;
pfd = context.getContentResolver().openFileDescriptor(uriSavedFile, "w");
FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());
// get the already saved video as fileinputstream
// The Directory where your file is saved
// File storageDir = new File(uri.getPath());
//Directory and the name of your video file to copy
File videoFile = new File(uri.getPath());
FileInputStream in = new FileInputStream(videoFile);
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
in.close();
pfd.close();
} else {
OutputStream out = context.getContentResolver().openOutputStream(uriSavedFile);
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap bmp = BitmapFactory.decodeFile(uri.getPath(), options);
bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
bmp.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 29) {
valuesFile.clear();
valuesFile.put(MediaStore.Video.Media.IS_PENDING, 0);
context.getContentResolver().update(uriSavedFile, valuesFile, null, null);
} else {
Intent localIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
final Uri localUri = Uri.fromFile(createdFile);
localIntent.setData(localUri);
context.sendBroadcast(localIntent);
}
}