添加删除图片并同步到相册

来源:互联网 发布: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;  }}




0 0