保存圖片到系統(tǒng)相冊
/**
* 獲取 圖片 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;
}
/**
* 將圖片保存到系統(tǒng)圖庫
*
* @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;
}
}
保存視頻到系統(tǒng)相冊
/**
* 獲取視頻 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;
}
/**
* 將視頻保存到系統(tǒng)圖庫
*
* @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; //字節(jié)數(shù) 文件大小
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, "復(fù)制單個文件操作出錯");
e.printStackTrace();
}
return false;
}
以上代碼均為FileHelper類方法
接下來看IPreviewActivity中如何調(diào)用
/**
* 保存到相冊
*/
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("已保存到系統(tǒng)圖庫");
}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("已保存到系統(tǒng)圖庫");
}
});
}
}.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 目標(biāo)存放文件路徑
*/
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);
//源文件,和目標(biāo)文件是同一個文件城舞,并且目標(biāo)文件存在轩触,直接返回
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;
}
為什么就保存至系統(tǒng)相冊代碼量如此多寞酿,也是為了兼容Android Q R 以上版本問題家夺。
主要操作步驟就是
1.將文件從app的沙盒目錄中將文件拷貝到Sdcard中
2.發(fā)送廣播去掃描文件
看了評論,補充兩部分源碼
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/","");
}
//網(wǎng)絡(luò)圖片
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;
}
}