保存图片到系统相册
/**
* 获取 图片 ContentValue
* @param paramFile
* @param paramLong
* @return
*/
public static ContentValues getImageContentValues(File paramFile, long paramLong) {
ContentValues localContentValues = new ContentValues();
localContentValues.put("title", paramFile.getName());
localContentValues.put("_display_name", paramFile.getName());
localContentValues.put("mime_type", "image/jpeg");
localContentValues.put("datetaken", Long.valueOf(paramLong));
localContentValues.put("date_modified", Long.valueOf(paramLong));
localContentValues.put("date_added", Long.valueOf(paramLong));
localContentValues.put("orientation", Integer.valueOf(0));
localContentValues.put("_data", paramFile.getAbsolutePath());
localContentValues.put("_size", Long.valueOf(paramFile.length()));
return localContentValues;
}
/**
* 将图片保存到系统图库
*
* @param imageFile
* @param context
*/
public static boolean saveImgToSystemAlbum(String imageFile, Context context) {
try {
ContentResolver localContentResolver = context.getContentResolver();
ContentValues localContentValues = getImageContentValues(new File(imageFile), System.currentTimeMillis());
localContentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, localContentValues);
Intent localIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
final Uri localUri = Uri.fromFile(new File(imageFile));
localIntent.setData(localUri);
context.sendBroadcast(localIntent);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
保存视频到系统相册
/**
* 获取视频 contentValue
* @param paramFile
* @param paramLong
* @return
*/
public static ContentValues getVideoContentValues(File paramFile, long paramLong) {
ContentValues localContentValues = new ContentValues();
localContentValues.put("title", paramFile.getName());
localContentValues.put("_display_name", paramFile.getName());
localContentValues.put("mime_type", "video/mp4");
localContentValues.put("datetaken", Long.valueOf(paramLong));
localContentValues.put("date_modified", Long.valueOf(paramLong));
localContentValues.put("date_added", Long.valueOf(paramLong));
localContentValues.put("_data", paramFile.getAbsolutePath());
localContentValues.put("_size", Long.valueOf(paramFile.length()));
return localContentValues;
}
/**
* 将视频保存到系统图库
*
* @param videoFile
* @param context
*/
public static boolean saveVideoToSystemAlbum(String videoFile, Context context) {
try {
ContentResolver localContentResolver = context.getContentResolver();
ContentValues localContentValues = getVideoContentValues(new File(videoFile), System.currentTimeMillis());
Uri localUri = localContentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, localContentValues);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q) {
// 拷贝到指定uri,如果没有这步操作,android11不会在相册显示
try {
OutputStream out = context.getContentResolver().openOutputStream(localUri);
copyFile(videoFile, out);
} catch (IOException e) {
e.printStackTrace();
}
}
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri));
//将该文件扫描到相册
//MediaScannerConnection.scanFile(context, new String[] { videoFile }, null, null);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 拷贝文件
* @param oldPath
* @param out
* @return
*/
public static boolean copyFile(String oldPath, OutputStream out) {
LogWrite.d(TAG, "oldPath = " + oldPath);
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) {
// 读入原文件
InputStream inStream = new FileInputStream(oldPath);
byte[] buffer = new byte[1444];
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节数 文件大小
System.out.println(bytesum);
out.write(buffer, 0, byteread);
}
inStream.close();
out.close();
return true;
}
else {
Log.w(TAG, String.format("文件(%s)不存在。", oldPath));
}
}
catch (Exception e) {
Log.e(TAG, "复制单个文件操作出错");
e.printStackTrace();
}
return false;
}
以上代码均为FileHelper类方法
接下来看IPreviewActivity中如何调用
/**
* 保存到相册
*/
private void saveToLocalSystem(){
final String dataUrl = adapter.getItem(viewPager.getCurrentItem());
File file = new File(dataUrl);
if(file.exists()){
//先拷贝到相册目录
String tempFile = null;
if(StringUtils.isVideo(dataUrl)) {
tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".mp4");
FileHelper.copyFile(file.getAbsolutePath(), tempFile);
FileHelper.saveVideoToSystemAlbum(tempFile, mContext);
}else{
tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".png");
FileHelper.copyFile(file.getAbsolutePath(), tempFile);
FileHelper.saveImgToSystemAlbum(tempFile, mContext);
}
showToast("已保存到系统图库");
}else{
//下载文件
final LoadingDialog dialog = LoadingDialog.show(mContext);
new Thread(){
@Override
public void run() {
final File file = ImageLoad.downloadImage(mContext, dataUrl);
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog.dismiss();
//文件拷贝到本地
String tempFile = null;
if(StringUtils.isVideo(dataUrl)) {
tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".mp4");
FileHelper.copyFile(file.getAbsolutePath(), tempFile);
FileHelper.saveVideoToSystemAlbum(tempFile, mContext);
}else{
tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile(".png");
FileHelper.copyFile(file.getAbsolutePath(), tempFile);
FileHelper.saveImgToSystemAlbum(tempFile, mContext);
}
showToast("已保存到系统图库");
}
});
}
}.start();
}
}
到这里就基本完成了,但缺下面两行代码的源码
tempFile = PathInfo.getInstance(mContext).getSDcardDCIMFile
FileHelper.copyFile(file.getAbsolutePath(), tempFile);
public String getSDcardDCIMFile(String suffix){
return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "DCIM" + File.separator + getTimeName() +suffix;
}
/**
* 拷贝文件
*
* @param sourcePath 原始文件路径
* @param targetPath 目标存放文件路径
*/
public static boolean copyFile(String sourcePath, String targetPath) {
//文件非空判断
if (TextUtils.isEmpty(sourcePath) || TextUtils.isEmpty(targetPath)) {
return false;
}
File source = new File(sourcePath);
File target = new File(targetPath);
//源文件,和目标文件是同一个文件,并且目标文件存在,直接返回
if (sourcePath.equals(targetPath) && target.exists()) {
return false;
}
if (!target.exists()) {
String path = targetPath.substring(0, targetPath.lastIndexOf("/"));
File s = new File(path);
s.mkdirs();
}
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(source));
out = new BufferedOutputStream(new FileOutputStream(target));
byte[] buf = new byte[8192];
int i;
while ((i = in.read(buf)) != -1) {
out.write(buf, 0, i);
}
} catch (Exception e) {
e.printStackTrace();
LogWrite.writeMsg(e);
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
为什么就保存至系统相册代码量如此多,也是为了兼容Android Q R 以上版本问题。
主要操作步骤就是
1.将文件从app的沙盒目录中将文件拷贝到Sdcard中
2.发送广播去扫描文件
看了评论,补充两部分源码
ImageLoad.downloadImage
/**
* 将相对路径补全绝对路径
* @param url
* @return
*/
public static String handImageUrl(String url) {
if (TextUtils.isEmpty(url)) {
return "";
}
//路径是决定路径(http开头)
if (url.startsWith("http")) {
return url;
}
//本地文件
if (new File(url).exists()) {
return url;
}
//截掉第一个/因为url头里面最后带了一个/
if (url.startsWith("/")) {
url = url.substring(1);
}
//防止拼接,中间没有/
String httpHead = HttpServerGet.IMAGE();
String prex = httpHead.endsWith("/") ? "" : "/";
//去掉oss前缀
if(url.startsWith("oss-img/")){
url = url.replace("oss-img/","");
}
//网络图片
return HttpServerGet.IMAGE() + prex + url;
}
/**
* 下载图片
* @param context
* @param url
* @return
*/
public static File downloadImage(Context context, String url){
try{
url = handImageUrl(url);
return Glide.with(context)
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
StringUtils.isVideo(本人这里只判断了mp4格式,需要多判断几种视频格式的,自行处理)
/**
* 是否为视频文件
* @param file
* @return
*/
public static boolean isVideo(String file) {
try {
return file.endsWith("MP4") || file.endsWith("mp4");
}catch (Exception e){
return false;
}
}