Android實現儲存圖片並刷新系統相簿圖片一直在最前面
阿新 • • 發佈:2019-01-10
最近在做運動手環專案,有一個功能要實現儲存二維碼,使用者在微信掃一掃直接掃描二維碼。其實功能很簡單,就是儲存檔案到本地。
MediaStore.Images.Media.insertImage(getContentResolver(), "image path", "title", "description");//插入相簿
String path = SAVE_REAL_PATH + fileName;
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse(path)));//更新相簿
其實以上程式碼確實能實現儲存圖片到本地,並且能重新整理相簿相簿,使用者開啟手機相簿能看到儲存的的圖片。
但是我的專案是儲存二維碼,使用者開啟微信去掃一掃,開啟掃一掃的時候,微信會開啟本地圖片,但是剛剛儲存的二維碼圖片不在最前面,只有選擇所有圖片,在其他目錄才能發現剛才儲存的二維碼,這對於使用者無疑體驗很不好的。於是百度找解決方案,有網友說儲存圖片帶上當前時間即可,相簿圖片可以根據時間排名,於是測試不。
後來發現通過呼叫MediaStore插入圖片可以解決此問題,這樣實現每次儲存的圖片,在微信開啟掃一掃時,圖片都在第一個,這樣對於使用者體驗就很好了。以下貼出程式碼
String dirName = Environment
.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM)
+ File.separator + "jwd";
File fileDir = new File(dirName);
if (!fileDir.exists()) {
fileDir.mkdir();
}
// 系統時間
long mImageTime = System.currentTimeMillis();
long dateSeconds = mImageTime / 1000;
// 檔名
String mImageFileName = "wechat_" + mac + ".png";
// 檔案路徑
String mImageFilePath = dirName + File.separator + mImageFileName;
File file = new File(mImageFilePath);
if (file.exists()) {
showTextDialog("二維碼已儲存");
mDialogHandler.sendEmptyMessageDelayed(1, 1000);
return;
}
//獲取截圖
View view = this.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
Bitmap bitmap = view.getDrawingCache();
int mImageWidth = bitmap.getWidth();
int mImageHeight = bitmap.getHeight();
// 儲存截圖到系統MediaStore
ContentValues values = new ContentValues();
ContentResolver resolver = mContext.getContentResolver();
values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);
values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);
values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png");
values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);
values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
try {
OutputStream out = resolver.openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);// bitmap轉換成輸出流,寫入檔案
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
// update file size in the database
values.clear();
values.put(MediaStore.Images.ImageColumns.SIZE,
new File(mImageFilePath).length());
resolver.update(uri, values, null, null);
showTextDialog("二維碼儲存成功");
mDialogHandler.sendEmptyMessageDelayed(1, 1000);
在此還一個小問題,就是呼叫
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);//儲存圖片資訊到系統MediaStore
當圖片儲存成功時再次儲存呼叫insert,就會返回一個null的uri,於是做了一個處理,當圖片不存在時在儲存,這樣就解決了uri是null 的問題。