Android 内容提供者刷新图片 和 Arraylist排序
前言: 把我之前自己写的图片选择器转移到我们公司的项目里了,然后发现了无数的坑,一路填过来,很难受,不过最终还是搞的差不多了,代码还没传,下篇随笔在给连接,先把标题要讲的写出来
1我以前一直不懂内容提供者为什么能成为四大组件之一(我技术这么菜是有原因的!!),现在才懂一点
不管是删除图片,还是新拍图片,都要通过内容提供者通知安卓系统一声,否则
添加图片如果不通知一下,结果就是拍下来的图片在手机相册里找不到,并且通过内容提供者查找图片也查不到,但是你去你设定好的路径去看,它就安静的在那里!!!
删除图片如果不通知一下,结果就是通过内容提供者查找图片的时候,还能找到已经被删掉的图片的地址,但其实那个地址已经没有图片了!!!
具体怎么通知
添加图片
MediaScannerConnection.scanFile(this, new String[]{图片的绝对路径}, null, null);
在这里要说一下第2个坑,百度上比较多的文章都是写的先插入到系统图库,在通知。
代码是酱婶儿的
try { MediaStore.Images.Media.insertImage(context.getContentResolver(), output.getAbsolutePath(), output.getName(), null); } catch (FileNotFoundException e) { e.printStackTrace(); } context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, imageUri));
坑在哪里,第一点:我是先把图片保存到我指定的路径了,然后在调用的上面的方法,然后重点来了,相册里和我的指定路径里各有一张图片!!!
第二,在低版本手机里(我用的模拟器),经过这么一弄,内容提供者一下找出来俩一样的图片,高版本手机呢,只找到相册里那一张,如果那相册里的删掉,那我指定路径里的图片留在手机里浪费内存!!!
总之我个人认为上面的办法略坑。
再说删除图片
private void DeleteImage(String imgPath) { ContentResolver resolver = context.getContentResolver(); Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?", new String[]{imgPath}, null); boolean result = false; if (cursor.moveToFirst()) { long id = cursor.getLong(0); Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri uri = ContentUris.withAppendedId(contentUri, id); int count = context.getContentResolver().delete(uri, null, null); result = count == 1; } else { File file = new File(imgPath); result = file.delete(); } if (result) { Toast.makeText(context, "删除成功", Toast.LENGTH_LONG).show(); } }
3按修改先后的顺序排列图片(时间顺序)(刚拍完的在前)
因为所有的照片都被我以bean的形式保存在list里了,所以简单地说就是list的排序问题
先获取图片的修改时间
new Date(file.lastModified()).getTime() //file 就是图片
之后就是一个让我惊呆了的排序方法(java太菜没有办法)
让我得bean类 实现Compartor接口,然后实现compare方法
@Override public int compare(PhotoBean o1, PhotoBean o2) { if(o1.getTime() > o2.getTime()){ return -1; }else{ return 1; } }
这个排序方法不多解释了,百度就好,但是我今天才知道这样子排序,惊了个呆!!
排序的时候直接
Collections.sort(list, new bean类);
就好了,这样就实现Arraylist的排序了
4最后看一下模拟器上的效果吧,模拟器没有摄像头不过不影响效果
上一篇: 存储过程简单实例
下一篇: 一个可以互相解决前端问题的地方