添加删除图片并同步到相册
来源:互联网 发布:java开发实战入门pdf 编辑:程序博客网 时间:2024/06/11 07:24
1:rn缓存图片
项目需求要做一个仿照微信多图片选择的功能,九宫格那种,大概就是先调用原生模块选择图片,然后将图片的uri或者绝对地址返回给rn,原生部分的代码嘛,
当然不用自己写github上面一搜一大堆,选一个就OK了,我使用的是photopicker 这个库,原生与rn的交互传递参数,
我使用的是promise回调方式,不知道如何交互的请看react与原生交互方式 rn调用原生模块。
然后react 主要是显示的作用。
问题一:首先将选择的图片压缩然后才能上传,在压缩后保存到路径时,因为一共可以选择9张图片所以我在取名字的时候 就叫temp0,temo1之类的,
第一次选择了5张成功显示,第二次再次选择的时候,发现前五张图片显示的还是上一次选择的图片。但是发送到服务器的确实是我第二次选择的图片。
原因:因为rn对图片是有缓存机制的,两次传递的图片路径是一样的,因此加载的是缓存内容,而上传时传递的是本地数据库里面的内容。
解决:通过UUID.randomUUID()将每次压缩后的文件名字随机生成不会重复,这样就不会出现缓存的情况。
因为解决问题1 可能会生成大量的图片,占用系统空间,因此要在应用退出程序时删除生成的图片缓存文件。
这就出现了第二个问题,当删除整个缓存文件夹后,相册中的图片并没有同步,导致用户可以选择已经删除的图片,
然后在压缩是报空指针因为不能从选择的路径中加载出图片。
问题2:删除图片并同步相册
解决:在删除图片文件后通过api删除数据库,同步相册,将已经删除的图片不在显示到相册内
Activity activity = getCurrentActivity(); if(activity!=null){ String Dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + "Legendzest_temp"; Log.i(TAG,"onHostDestroy"); if(FileUtils.fileIsExists(Dir)){//清除上次缓存否则rn图片会出现重复情况 File dir = new File(Dir); List<String> list = FileUtils.getpaths(dir); Log.i(TAG,"list"+list.get(0)); FileUtils.deleteDir(dir); for(String str:list){//清除缓存数据 MediaUtils.removeImageFromLib(activity,str); } Log.i(TAG,"删除文件"); } } }文件工具类:
public class FileUtils { private static final String TAG = "FileUtils"; private static final boolean DEBUG = false; public static boolean fileIsExists(String path) { if (path == null || path.trim().length() <= 0) { return false; } try { File f = new File(path); if (!f.exists()) { return false; } } catch (Exception e) { return false; } Log.e("TMG",path+"file not exists"); return true; } //删除文件内容 public static boolean deleteFile(String path){ File out = new File(path); boolean delete = false; if(out.exists()){ if(!out.delete()){ delete= false; }else{ delete= true; } } return delete; } //删除文件夹及文件内容 public static void deleteDir(File file){ if(file.isFile()){ file.delete(); return; } if(file.isDirectory()){ File[] childFile = file.listFiles(); if(childFile==null||childFile.length==0){ file.delete(); return; } for(File f:childFile){ deleteDir(f); } file.delete(); } } //删除图片文件夹及文件内容 public static List<String> getpaths(File file){ List<String> list = new ArrayList<>(); if(file.isDirectory()){ File[] childFile = file.listFiles(); if(childFile==null||childFile.length==0){ return list; } for(File f:childFile){ list.add(f.getAbsolutePath()); } } return list; } //创建文件夹 public static boolean createDir(String Dir){ boolean b; File dir = new File(Dir); if(!dir.exists()){ b = dir.mkdirs();//mkdir 父目录不存在 不能创建文件 }else { b = true; } return b; } public static String getFileMimeType(String filename) { if (TextUtils.isEmpty(filename)) { return null; } int lastDotIndex = filename.lastIndexOf('.'); String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension( filename.substring(lastDotIndex + 1).toLowerCase()); return mimetype; }}
MediaUtils:
public class MediaUtils { private static final String LOGTAG = "MediaUtils"; /** * Scan a media file by sending a broadcast.This is the easiest way. * 对方成功接收广播并处理条件 文件必须存在,文件路径必须以Environment.getExternalStorageDirectory().getPath() 的返回值开头 */ public static void sendScanFileBroadcast(Context context, String filePath) { File file = new File(filePath); Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)); context.sendBroadcast(intent); } /** * * @param context * @param paths File paths to scan * @param mimeTypes mimeTypes in array;it could be null;then * @param callback */ public static void scanFiles(Context context, String[] paths, String[] mimeTypes, MediaScannerConnection.OnScanCompletedListener callback) { if (null != paths && paths.length != 0) { MediaScannerConnection.scanFile(context, paths, mimeTypes, callback); } else { Log.i(LOGTAG, "scanFiles paths = null or paths.length=0 paths=" + paths); } } public static void scanFiles(Context context, String[] paths, String[] mimeTypes) { scanFiles(context, paths, mimeTypes, null); } public static void scanFiles(Context context, String[] paths) { scanFiles(context, paths, null); } public static int removeImageFromLib(Context context, String filePath) { ContentResolver resolver = context.getContentResolver(); return resolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA + "=?", new String[]{filePath}); } public static int removeAudioFromLib(Context context, String filePath) { return context.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MediaStore.Audio.Media.DATA + "=?", new String[] {filePath}); } public static int removeVideoFromLib(Context context, String filePath) { return context.getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, MediaStore.Video.Media.DATA + "=?", new String[] {filePath}); } public static int removeMediaFromLib(Context context, String filePath) { String mimeType = FileUtils.getFileMimeType(filePath); int affectedRows = 0; if (null != mimeType) { mimeType = mimeType.toLowerCase(Locale.US); if (isImage(mimeType)) { affectedRows = removeImageFromLib(context, filePath); } else if (isAudio(mimeType)) { affectedRows = removeAudioFromLib(context ,filePath); } else if (isVideo(mimeType)) { affectedRows = removeVideoFromLib(context, filePath); } } return affectedRows; } public static boolean isAudio(String mimeType) { return mimeType.startsWith("audio"); } public static boolean isImage(String mimeType) { return mimeType.startsWith("image"); } public static boolean isVideo(String mimeType) { return mimeType.startsWith("video"); } public static boolean isMediaFile(String filePath) { String mimeType = FileUtils.getFileMimeType(filePath); return isMediaType(mimeType); } public static boolean isMediaType(String mimeType) { boolean isMedia = false; if (!TextUtils.isEmpty(mimeType)) { mimeType = mimeType.toLowerCase(Locale.US); isMedia = isImage(mimeType) || isAudio(mimeType) || isVideo(mimeType); } return isMedia; } /** * Before using it,please do have a media type check. * @param context * @param srcPath * @param destPath * @return */ public static int renameMediaFile(Context context, String srcPath, String destPath) { removeMediaFromLib(context, srcPath); sendScanFileBroadcast(context, destPath); return 0; }}
- 添加删除图片并同步到相册
- Android 删除文件夹中的图片并同步到媒体库
- 照片保存到相册,并添加到自定义相册中
- iphone simulator 如何添加图片到相册
- 保存图片到系统相册并更新
- android 保存图片到手机相册,并通知相册刷新
- Android删除手机本地图片并同步到本地图片媒体库
- iOS 把图片保存到相册,并获取图片文件名
- Android删除图片并同步图库
- ios添加删除查看相册或拍照图片实现
- [iOS]删除相册图片
- iPhone模拟器之将图片添加到相册实例
- Android 相册图片 添加应用到分享列表
- Android调用系统相机和相册添加图片到
- IOS 单击图片全屏显示并存储到本地相册
- 保存图片到本地,并及时在系统相册更新
- 获取网络图片并下载到本地相册
- 截屏,并将截取的图片保存到相册中
- Note04
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supporte
- JAVA中几种文件操作流的效率对比
- Locust使用点滴
- 健身饮食计划:增肌人群
- 添加删除图片并同步到相册
- Loki库源码读解随想
- Note05
- 系统架构设计师教程知识整理——绪论(一)
- 英语学术论文常用句型
- 区块链专家技能图谱
- XUtils—支持大文件上传,更全面的网络工具
- deepin linux mysql工具
- 【C语言】模拟实现strcmp()、strncmp()函数