概述
此功能麻煩的地方主要在機型適配上。
此功能實現步驟如下:
- 將圖片存儲到手機picture目錄下。(一般是從原位置複製過來)
- 將該文件掃描到相冊。
本文的例子是將應用自帶的內容存儲到picture目錄。
筆者看到目前市場上一些app有直接存儲到DCIM目錄下的。也是可行的,但是筆者個人認爲最好還是隻有相機相關功能生成的圖片與視頻存儲到該目錄下,否則就用戶體驗來講可能會讓人比較奇怪。
另外,不同目錄在不同手機 ”相冊“中的表現也有所區別,僅拿小米手機舉例:picture目錄中存儲的內容可以再相冊的”最近“中看到,而"DCIM/Camera"中存儲的內容只能在相冊的”相機“中看到。
源碼
public class ImageUtils {
//在picture目錄下新建一個自己文件夾
private static final String rootPath =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/appname";
/**
* 這個方法用來把已經存在的一個文件存儲到相冊
*
* @param context 用來發送廣播
* @param srcString 需要拷貝的文件的地址
*/
public static void saveFileToAlbum(Context context, String srcString) {
if (TextUtils.isEmpty(srcString)) {
return;
}
File srcFile = new File(srcString);
if (!srcFile.exists()) {
return;
}
//如果root文件夾沒有需要新建一個
createDirIfNotExist();
//拷貝文件到picture目錄下
File destFile = new File(rootPath + "/" + srcFile.getName());
copyFile(srcFile, destFile);
//將該文件掃描到相冊
MediaScannerConnection.scanFile(context, new String[] { destFile.getPath() }, null, null);
}
public static void createDirIfNotExist() {
File file = new File(rootPath);
if (!file.exists()) {
try {
file.mkdirs();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void copyFile(File src, File dest) {
if (!src.getAbsolutePath().equals(dest.getAbsolutePath())) {
try {
InputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) >= 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
發送廣播掃描相冊
筆者也使用過使用廣播掃描相冊的方式。
實際使用的時候會出現相冊刷新不及時,在個別機型上沒有刷新的問題,於是最終還是採用了上面的做法。
使用廣播掃描相冊可以掃描某個目錄下的所有文件,而上面demo中的做法是隻掃描某個文件。
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(new File(rootPath));
intent.setData(uri);
context.sendBroadcast(intent);
部分vivo手機的問題
部分vivo手機的視頻只有存儲在”相機“目錄下的時候纔會刷新生效。
筆者碰到這個問題的處理邏輯如下:
- 先判斷是否是vivo手機
- 如果是vivo手機,那麼將視頻在”相機“目錄多拷貝一份,也多做一次刷新邏輯。