android开发,APP下载成功的图片或者视频同时显示在手机自带的相册里
来源:互联网 发布:bcd安装linux 编辑:程序博客网 时间:2024/09/21 09:01
这篇文章不是完全的原创,因为有借鉴了网上的一些资料,一个辅助类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;import android.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();}
这样就可以了
我不是个呆若木鸡的小小英
阅读全文
0 0
- android开发,APP下载成功的图片或者视频同时显示在手机自带的相册里
- 手机里的图片在相册里显示不了
- Android下载的视频,在相册中显示
- 安卓开发下载图片保存到手机后图片没在相册看到的问题
- iOS访问手机自带的相册
- android——生成或者下载的图片在相册中找不到
- Android使用自带的程序打开图片或者文本
- android将下载的图片显示到媒体相册中
- 用git下载Android自带app的源代码
- ios开发如何让navigationItem自带的返回按钮设置成图片或者不显示文字
- Android开发——相册拍照_02.将拍照得到或相册中选择的图片显示在ImageView中
- android技巧:把自己的app变成手机系统自带的app[/system/app]
- android技巧:把自己的app变成手机系统自带的app[/system/app]
- android技巧:把自己的app变成手机系统自带的app[/system/app]
- 在android项目里使用自带的SQLite数据库
- iOS开发 系统自带保存图片到相册的方法
- 手机自带的显示基站命令
- 如何在ImagePickerController中只显示图片或者视频?(既视频和图片的筛选)
- Java字符之间的运算
- 聚类(斯坦福machine learning week 8)
- 习题8
- Linux system 网络接口及高级网络桥接
- nginx实现静态资源服务器
- android开发,APP下载成功的图片或者视频同时显示在手机自带的相册里
- Angular(二):怎样理解ng-options
- 把一个文件拷贝到另外一个文件,需要打开两个文件,一个读取,一个写入
- $("input[id^='sid']")是什么写法
- MyBiTree
- 负载均衡的开源软件:LVS配置
- Hibernate的基于外健的one-to-one
- PAT 1026. 程序运行时间(15)
- 【深度学习】向量化加速(1)