拍照、预览、多选、删除

转载 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高仿微信拍照、多选、预览、删除(去除相片)相册功能

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

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

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

IOS开发 两、三个界面相互传值,类似android的onActivityResult(拍照上传、预览图片、点击查看、删除)

今天终于把拍照上传、预览图片、点击查看、删除这一系列的图片处理功能。中间遇到了感觉难以克服的困难,经过查资料,询问各位大侠,最后终于完工。下面是我遇到的困难以及解决办法。     首先说一下我们的要...

安卓 仿微信朋友圈选择图片,拍照,大图预览,删除等功能

首先看一下基本的效果图: 1,GridView和加号的实现,直接上代码 布局文件: <GridView android:id="@+id/gv_kinder_image"...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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