拍照、预览、多选、删除

转载 2015年07月10日 17:38:06


1、拍照能实时保存到本地并实时查询(不必用广播或者服务)

2、拍照保存到到自定义路径并根据不同文件夹显示文件夹下的相片

3、多选规定张数图片

4、用到的集合有:

      (1)、所有相片集合

      (2)、不同文件下相片集合

      (3)、系统保存相片的文件夹集合

      (4)、已选中相片集合

5、每次选中返回上级界面时都要传递已选中的相片来跟当前所显示的相册集合进行对比使得checkbox是否勾选

6、自己碰到的问题有:

     (1)、当选择相片量超过特定数量时CheckBox的setOnCheckedChangeListener事件会出现错误(不是bug,可能我的代码逻辑不够严谨),主要是在设定控件自带的setChecked(false|true)方法时出现的;

所以我用了onClick方法来实现其选中状态。

  (2)、预览相册返回上级(展示文件夹下的相片)时集合的对比,在考虑到性能的情况下,本人用了map集合来记录保存已选中的相片,

回调界面时遍历当前文件夹下的相片判断map集合是否包含,包含则让checkbox为选中状态。

  (3)、在删除图片时,自己的业务并不和微信的一样,此项目只让用户选中和不选中而已回调到界面一样是可以显示自己所要的效果。

7、主要代码:

   (1)、获取最近照片列表

  1. public List<PhotoModel> getCurrent() {  
  2.     Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,  
  3.             ImageColumns.DATE_ADDED, ImageColumns.SIZE }, nullnull, ImageColumns.DATE_ADDED);  
  4.     if (cursor == null || !cursor.moveToNext())  
  5.         return new ArrayList<PhotoModel>();  
  6.     List<PhotoModel> photos = new ArrayList<PhotoModel>();  
  7.     cursor.moveToLast();  
  8.     do {  
  9.         if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {  
  10.             PhotoModel photoModel = new PhotoModel();  
  11.             photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));  
  12.             photos.add(photoModel);  
  13.         }  
  14.     } while (cursor.moveToPrevious());  
  15.     return photos;  
  16. }  
   (2)、获取所有相册列表 

  1.       public List<AlbumModel> getAlbums() {  
  2. List<AlbumModel> albums = new ArrayList<AlbumModel>();  
  3. Map<String, AlbumModel> map = new HashMap<String, AlbumModel>();  
  4. Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,  
  5.         ImageColumns.BUCKET_DISPLAY_NAME, ImageColumns.SIZE }, nullnullnull);  
  6. if (cursor == null || !cursor.moveToNext())  
  7.     return new ArrayList<AlbumModel>();  
  8. cursor.moveToLast();  
  9. AlbumModel current = new AlbumModel("最近照片"0,   
  1. cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)), true); // "最近照片"相册  
  2.         albums.add(current);  
  3.         do {  
  4.             if (cursor.getInt(cursor.getColumnIndex(ImageColumns.SIZE)) < 1024 * 10)  
  5.                 continue;  
  6.   
  7.             current.increaseCount();  
  8.             String name = cursor.getString(cursor.getColumnIndex(ImageColumns.BUCKET_DISPLAY_NAME));  
  9.             if (map.keySet().contains(name))  
  10.                 map.get(name).increaseCount();  
  11.             else {  
  12.                 AlbumModel album = new AlbumModel(name, 1, cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));  
  13.                 map.put(name, album);  
  14.                 albums.add(album);  
  15.             }  
  16.         } while (cursor.moveToPrevious());  
  17.         return albums;  
  18.     }  
   (3)、获取对应相册下的照片 

  1. public List<PhotoModel> getAlbum(String name) {  
  2.     Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.BUCKET_DISPLAY_NAME,  
  3.             ImageColumns.DATA, ImageColumns.DATE_ADDED, ImageColumns.SIZE }, "bucket_display_name = ?",  
  4.             new String[] { name }, ImageColumns.DATE_ADDED);  
  5.     if (cursor == null || !cursor.moveToNext())  
  6.         return new ArrayList<PhotoModel>();  
  7.     List<PhotoModel> photos = new ArrayList<PhotoModel>();  
  8.     cursor.moveToLast();  
  9.     do {  
  10.         if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {  
  11.             PhotoModel photoModel = new PhotoModel();  
  12.             photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));  
  13.             photos.add(photoModel);  
  14.         }  
  15.     } while (cursor.moveToPrevious());  
  16.     return photos;  
  17. }  
   (4)、拍照并及时更新本地相册

  1.     public void photo() {  
  2. //      Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  3. //      startActivityForResult(openCameraIntent, TAKE_PICTURE);  
  4.           
  5.         try {  
  6.             File dir = new File(Environment.getExternalStorageDirectory()+ "/" + localTempImgDir);  
  7.             System.out.println("图片名称:"+dir.getPath());  
  8.             if (!dir.exists()){  
  9.                 dir.mkdirs();  
  10.             }  
  11.             localTempImgFileName=System.currentTimeMillis()+".jpg";  
  12.             Intent intent = new Intent(  
  13.                     android.provider.MediaStore.ACTION_IMAGE_CAPTURE);  
  14.             File f = new File(dir, localTempImgFileName);// localTempImgDir和localTempImageFileName是自己定义的名字  
  15.             Uri u = Uri.fromFile(f);  
  16.             intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);  
  17.             intent.putExtra(MediaStore.EXTRA_OUTPUT, u);  
  18.             startActivityForResult(intent, ResultTag.CODE_TOPHOTO);  
  19.         } catch (ActivityNotFoundException e) {  
  20.             Toast.makeText(PublishActivity.this"没有找到储存目录",Toast.LENGTH_LONG).show();  
  21.         }  
  22.     }  
   (5)、拍照并及时更新本地相册
  1. @Override    
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     super.onActivityResult(requestCode, resultCode, data);  
  4.        //相机照相返回  
  5.     if (requestCode == ResultTag.CODE_TOPHOTO) {  
  6.         File f = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir + "/" + localTempImgFileName);  
  7.           
  8.         String sdStatus = Environment.getExternalStorageState();  
  9.         if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用  
  10.             Log.v("TestFile","SD card is not avaiable/writeable right now.");  
  11.             return;  
  12.         }  
  13.         try {  
  14.             Uri u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),  
  15.                     f.getAbsolutePath(), nullnull));  
  16.             System.out.println("地址为:"+f.getAbsolutePath());  
  17.             MediaScannerConnection.scanFile(this,  
  18.   
  19.                      new String[] { f.getAbsolutePath()}, null,  
  20.   
  21.                      new MediaScannerConnection.OnScanCompletedListener() {  
  22.   
  23.                  public void onScanCompleted(String path, Uri uri) {  
  24.   
  25.                      Log.i("ExternalStorage""Scanned " + path + ":");  
  26.   
  27.                      Log.i("ExternalStorage""-> uri=" + uri);  
  28.   
  29.                  }  
  30.   
  31.              });  
  32.               
  33.         } catch (FileNotFoundException e) {  
  34.             e.printStackTrace();  
  35.         }   
  36.           
  37.         PhotoModel takePhoto = new PhotoModel();  
  38.         takePhoto.setChecked(true);  
  39.         takePhoto.setOriginalPath(f.getAbsolutePath());  
  40.         selectedShow.add(takePhoto);   
  41.         adapter.notifyDataSetChanged();  
  42.     }  
  43. }  

android高仿微信拍照、多选、预览、删除(去除相片)相册功能

工作了将近三年时间了,一直没正儿八经的研究系统自带的相册和拍照,这回来个高仿微信的拍照、多选、预览、删除(去除相片)相册功能,之前开发的所有应用都带有这需求,但是一直都不实用!废话就不多说了,先来捋一...
  • Shi508181017
  • Shi508181017
  • 2015年06月25日 14:43
  • 2367

【iOS】拍照/相册单选、相册多选、图片浏览、图片裁剪

有一段时间没有写iOS系列的博客了。最近由于项目的需要,就有封装了一个拍照/相册单选、相册多选、图片浏览、图片裁剪的工具类。在封装这这类是站在巨人的肩膀上做的。 1.ZLPhotoBrowser:h...
  • zhuming3834
  • zhuming3834
  • 2017年01月04日 10:44
  • 3624

安卓选择图片上传功能【支持多选拍照预览等】

在网上找了很多第三方的相册拍照框架,都不尽人意,最后终于找到了一个比较好的框架,并且集成到了自己的demo中,花了两天的时间吧感觉挺值的。老规矩不说废话,直接上代码。 感谢某开源库的作者:Alu...
  • qq_24531461
  • qq_24531461
  • 2017年07月07日 11:46
  • 483

照相机预览、拍照以及适配问题的完美解决

前段时间在做face++相关的功能,对于照相机也是进行了一番研究,小有收获,解决了不少拍照预览图片模糊、部分机型黑屏等问题,目前已经保证了团队里面十多部安卓手机的完美适配。...
  • shan286
  • shan286
  • 2016年11月18日 11:14
  • 3006

html调用摄像头拍照,并生成预览

参考内容:http://blog.jianchihu.net/talking-about-the-html5-camera-api.html
  • HoperandEvian
  • HoperandEvian
  • 2014年10月21日 16:20
  • 978

Android笔记:仿系统图片库(GridView的多选删除)实用篇

Android、照片库、gridView的多选删除 仿系统照片库 照片墙 Lrucach Bitmap 缓存 File...
  • xiaoyu940601
  • xiaoyu940601
  • 2016年11月29日 14:36
  • 1416

Android 手机拍照预览图像与拍照图像

参考:http://www.tuicool.com/articles/AnUBBnR             http://www.eoeandroid.com/thread-80028-1-1...
  • muzhengjun
  • muzhengjun
  • 2016年01月19日 11:20
  • 565

Android 超高仿微信图片多选、单选,图片剪切,图片预览,拍照等功能

github地址: https://github.com/ioneday/ImageSelector 实现了微信图片选择的所有功能 单选、多选 单选,没有预览功能。 多选,可以控制最大 选择图...
  • heiday
  • heiday
  • 2015年12月20日 16:10
  • 3965

android 相机圆形,矩形拍照预览

首先,相机这块我也不是特别懂,之前也没开发过这块。参考了YanZi大神的文章http://blog.csdn.net/yanzi1225627/article/details/34931759不多说,...
  • wu244208909
  • wu244208909
  • 2016年08月25日 15:35
  • 774

android camera无预览拍照 后台拍照

前言:相信有许多人和我一样,希望在不让用户知道的情况下,使用后台Server调用摄像头拍照, 在网上找了不少资料,大致都讲到不预览无法实现拍照,涉及到用户隐私,属于非法调用摄像头...怎么办!!! 曾...
  • a740169405
  • a740169405
  • 2013年09月30日 23:43
  • 11928
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:拍照、预览、多选、删除
举报原因:
原因补充:

(最多只允许输入30个字)