android開發,APP下載成功的圖片或者視訊同時顯示在手機自帶的相簿裡
阿新 • • 發佈:2019-02-16
這篇文章不是完全的原創,因為有借鑑了網上的一些資料,一個輔助類AlbumNotifyHelper.java
謝謝寫這個輔助類的大神,因為我找不到作者文章的原地址了,所以我在這裡就貼出程式碼,不直接連結原作者的文章。
1。輔助類
import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; importandroid.util.Log; import java.io.File; /** * CreateAt : 2017/5/24 * Describe : 相簿更新通知幫助類 * 建立時間單位ms * 視訊時長單位ms * */ public class AlbumNotifyHelper { public static final String TAG = AlbumNotifyHelper.class.getSimpleName(); /////////////////////////////////////////////////////////////////////////// // 下面是對外公開的過載的方法 /////////////////////////////////////////////////////////////////////////// public static void notifyScanDcim(Context context, String filePath) { scanFile(context, filePath); } public static void insertVideoToMediaStore(Context context, String filePath, long dateTaken, long duration) { insertVideoToMediaStore(context, filePath, dateTaken, 0, 0, duration); } /* public static void insertVideoToMediaStore(Context context, VideoUtil.VideoInfo videoInfo) {insertVideoToMediaStore(context, videoInfo.originalVideoFilePath, videoInfo.dateTaken, videoInfo.width, videoInfo.height, videoInfo.duringTime); }*/ public static void insertImageToMediaStore(Context context, String filePath, long createTime) { insertImageToMediaStore(context, filePath, createTime, 0, 0); } /////////////////////////////////////////////////////////////////////////// // 掃描系統相簿核心方法 /////////////////////////////////////////////////////////////////////////// /** * 針對系統文夾只需要掃描,不用插入內容提供者,不然會重複 * * @param context 上下文 * @param filePath 檔案路徑 */ public static void scanFile(Context context, String filePath) { if (!checkFile(filePath)) return; Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(Uri.fromFile(new File(filePath))); context.sendBroadcast(intent); } /////////////////////////////////////////////////////////////////////////// // 非系統相簿像MediaContent中插入資料,核心方法 /////////////////////////////////////////////////////////////////////////// /** * 針對非系統資料夾下的檔案,使用該方法 * 插入時初始化公共欄位 * * @param filePath 檔案 * @param time ms * @return ContentValues */ private static ContentValues initCommonContentValues(String filePath, long time) { ContentValues values = new ContentValues(); File saveFile = new File(filePath); long timeMillis = getTimeWrap(time); values.put(MediaStore.MediaColumns.TITLE, saveFile.getName()); values.put(MediaStore.MediaColumns.DISPLAY_NAME, saveFile.getName()); values.put(MediaStore.MediaColumns.DATE_MODIFIED, timeMillis); values.put(MediaStore.MediaColumns.DATE_ADDED, timeMillis); values.put(MediaStore.MediaColumns.DATA, saveFile.getAbsolutePath()); values.put(MediaStore.MediaColumns.SIZE, saveFile.length()); return values; } /** * 儲存到照片到本地,並插入MediaStore以保證相簿可以檢視到,這是更優化的方法,防止讀取的照片獲取不到寬高 * * @param context 上下文 * @param filePath 檔案路徑 * @param createTime 建立時間 <=0時為當前時間 ms * @param width 寬度 * @param height 高度 */ public static void insertImageToMediaStore(Context context, String filePath, long createTime, int width, int height) { if (!checkFile(filePath)) return; createTime = getTimeWrap(createTime); ContentValues values = initCommonContentValues(filePath, createTime); values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, createTime); values.put(MediaStore.Images.ImageColumns.ORIENTATION, 0); values.put(MediaStore.Images.ImageColumns.ORIENTATION, 0); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { if (width > 0) values.put(MediaStore.Images.ImageColumns.WIDTH, 0); if (height > 0) values.put(MediaStore.Images.ImageColumns.HEIGHT, 0); } values.put(MediaStore.MediaColumns.MIME_TYPE, getPhotoMimeType(filePath)); context.getApplicationContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } /** * 儲存到視訊到本地,並插入MediaStore以保證相簿可以檢視到,這是更優化的方法,防止讀取的視訊獲取不到寬高 * * @param context 上下文 * @param filePath 檔案路徑 * @param createTime 建立時間 <=0時為當前時間 ms * @param duration 視訊長度 ms * @param width 寬度 * @param height 高度 */ public static void insertVideoToMediaStore(Context context, String filePath, long createTime, int width, int height, long duration) { if (!checkFile(filePath)) return; createTime = getTimeWrap(createTime); ContentValues values = initCommonContentValues(filePath, createTime); values.put(MediaStore.Video.VideoColumns.DATE_TAKEN, createTime); if (duration > 0) values.put(MediaStore.Video.VideoColumns.DURATION, duration); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { if (width > 0) values.put(MediaStore.Video.VideoColumns.WIDTH, width); if (height > 0) values.put(MediaStore.Video.VideoColumns.HEIGHT, height); } values.put(MediaStore.MediaColumns.MIME_TYPE, getVideoMimeType(filePath)); context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); } // 是不是系統相簿 private static boolean isSystemDcim(String path) { return path.toLowerCase().contains("dcim") || path.toLowerCase().contains("camera"); } // 獲取照片的mine_type private static String getPhotoMimeType(String path) { String lowerPath = path.toLowerCase(); if (lowerPath.endsWith("jpg") || lowerPath.endsWith("jpeg")) { return "image/jpeg"; } else if (lowerPath.endsWith("png")) { return "image/png"; } else if (lowerPath.endsWith("gif")) { return "image/gif"; } return "image/jpeg"; } // 獲取video的mine_type,暫時只支援mp4,3gp private static String getVideoMimeType(String path) { String lowerPath = path.toLowerCase(); if (lowerPath.endsWith("mp4") || lowerPath.endsWith("mpeg4")) { return "video/mp4"; } else if (lowerPath.endsWith("3gp")) { return "video/3gp"; } return "video/mp4"; } // 獲得轉化後的時間 private static long getTimeWrap(long time) { if (time <= 0) { return System.currentTimeMillis(); } return time; } // 檢測檔案存在 private static boolean checkFile(String filePath) { //boolean result = FileUtil.fileIsExist(filePath); boolean result = false; File mFile = new File(filePath); if (mFile.exists()){ result = true; } Log.e(TAG, "檔案不存在 path = " + filePath); return result; }
2.下載成功後呼叫,傳入下載成功的圖片或者視訊的本地地址重新整理手機相簿
private ArrayList<String> mListPathSysImg = new ArrayList<>();//通知系統圖庫專用
***
//以下是我專案用到的,把它替換成你的就可以
if(mListPathSysImg.size()!=0){ //下載成功,刷新系統相簿 視訊部分手機不支援顯示(如ivo,魅藍) for (int i=0;i<mListPathSysImg.size();i++){ String nDownLoadPath = mListPathSysImg.get(i); String updateImgPath = FileUtil.getDownLoad()+nDownLoadPath.substring(nDownLoadPath.lastIndexOf("/")); if(updateImgPath.contains(".LRV")){ updateImgPath = updateImgPath.replace(".LRV",".MP4"); AlbumNotifyHelper.insertVideoToMediaStore(this,updateImgPath,0,5000); }else{ AlbumNotifyHelper.insertImageToMediaStore(this,updateImgPath,0); } //Log.e("nDownLoadPath----more-->","nDownLoadPath="+nDownLoadPath+",updateImgPath="+updateImgPath); } mListPathSysImg.clear(); }
這樣就可以了
我不是個呆若木雞的小小英