先声明授人与鱼不如授人与渔,仅仅能提供一个思路,当然须要源代码的同学能够私下有偿问我要源代码:QQ:508181017

工作了将近三年时间了,一直没正儿八经的研究系统自带的相冊和拍照,这回来个高仿微信的拍照、多选、预览、删除(去除相片)相冊功能,

之前开发的全部应用都带有这需求,可是一直都不有用!废话就不多说了,先来捋一下思路:

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)、获取近期照片列表

   public List<PhotoModel> getCurrent() {Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,ImageColumns.DATE_ADDED, ImageColumns.SIZE }, null, null, ImageColumns.DATE_ADDED);if (cursor == null || !cursor.moveToNext())return new ArrayList<PhotoModel>();List<PhotoModel> photos = new ArrayList<PhotoModel>();cursor.moveToLast();do {if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {PhotoModel photoModel = new PhotoModel();photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));photos.add(photoModel);}} while (cursor.moveToPrevious());return photos;}

(2)、获取全部相冊列表

        public List<AlbumModel> getAlbums() {List<AlbumModel> albums = new ArrayList<AlbumModel>();Map<String, AlbumModel> map = new HashMap<String, AlbumModel>();Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,ImageColumns.BUCKET_DISPLAY_NAME, ImageColumns.SIZE }, null, null, null);if (cursor == null || !cursor.moveToNext())return new ArrayList<AlbumModel>();cursor.moveToLast();AlbumModel current = new AlbumModel("近期照片", 0, 
cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)), true); // "近期照片"相冊albums.add(current);do {if (cursor.getInt(cursor.getColumnIndex(ImageColumns.SIZE)) < 1024 * 10)continue;current.increaseCount();String name = cursor.getString(cursor.getColumnIndex(ImageColumns.BUCKET_DISPLAY_NAME));if (map.keySet().contains(name))map.get(name).increaseCount();else {AlbumModel album = new AlbumModel(name, 1, cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));map.put(name, album);albums.add(album);}} while (cursor.moveToPrevious());return albums;}

(3)、获取相应相冊下的照片

   public List<PhotoModel> getAlbum(String name) {Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.BUCKET_DISPLAY_NAME,ImageColumns.DATA, ImageColumns.DATE_ADDED, ImageColumns.SIZE }, "bucket_display_name = ?",new String[] { name }, ImageColumns.DATE_ADDED);if (cursor == null || !cursor.moveToNext())return new ArrayList<PhotoModel>();List<PhotoModel> photos = new ArrayList<PhotoModel>();cursor.moveToLast();do {if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {PhotoModel photoModel = new PhotoModel();photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));photos.add(photoModel);}} while (cursor.moveToPrevious());return photos;}

(4)、拍照并及时更新本地相冊

 public void photo() {
//      Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//      startActivityForResult(openCameraIntent, TAKE_PICTURE);try {File dir = new File(Environment.getExternalStorageDirectory()+ "/" + localTempImgDir);System.out.println("图片名称:"+dir.getPath());if (!dir.exists()){dir.mkdirs();}localTempImgFileName=System.currentTimeMillis()+".jpg";Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);File f = new File(dir, localTempImgFileName);// localTempImgDir和localTempImageFileName是自定义的名字Uri u = Uri.fromFile(f);intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);intent.putExtra(MediaStore.EXTRA_OUTPUT, u);startActivityForResult(intent, ResultTag.CODE_TOPHOTO);} catch (ActivityNotFoundException e) {Toast.makeText(PublishActivity.this, "没有找到储存文件夹",Toast.LENGTH_LONG).show();}}

(5)、拍照并及时更新本地相冊

   @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);//相机照相返回if (requestCode == ResultTag.CODE_TOPHOTO) {File f = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir + "/" + localTempImgFileName);String sdStatus = Environment.getExternalStorageState();if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检測sd是否可用Log.v("TestFile","SD card is not avaiable/writeable right now.");return;}try {Uri u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),f.getAbsolutePath(), null, null));System.out.println("地址为:"+f.getAbsolutePath());MediaScannerConnection.scanFile(this,new String[] { f.getAbsolutePath()}, null,new MediaScannerConnection.OnScanCompletedListener() {public void onScanCompleted(String path, Uri uri) {Log.i("ExternalStorage", "Scanned " + path + ":");Log.i("ExternalStorage", "-> uri=" + uri);}});} catch (FileNotFoundException e) {e.printStackTrace();} PhotoModel takePhoto = new PhotoModel();takePhoto.setChecked(true);takePhoto.setOriginalPath(f.getAbsolutePath());selectedShow.add(takePhoto); adapter.notifyDataSetChanged();}}

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

  1. android+高仿视频录制,Android高仿微信拍照控件,实战推荐!

    原标题:Android高仿微信拍照控件,实战推荐! 作者:陈嘉桐 转自:ttps://github.com/CJT2325 控件介绍 不知道是不是在微信更新到6.0版本之后,微信将它的拍照和录制视频的 ...

  2. Android高仿微信图片多选功能

    1.概述 关于手机图片加载器,在当今像素随随便便破千万的时代,一张图片占据的内存都相当可观,作为高大尚程序猿的我们,有必要掌握图片的压缩,缓存等处理,以到达纵使你有万张照片,纵使你的像素再高,我们也能 ...

  3. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  4. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  5. android+高仿视频录制,android高仿微信视频编辑页

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

  6. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  7. android高仿微信视频编辑页-视频多张图片提取

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

  8. android仿微信聊天功能,Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们 ...

  9. android 微信高仿,Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们 ...

最新文章

  1. 如何识别和避免间谍软件
  2. UCSC hg19.ensembl.gtf
  3. WSL 使用者仍应该使用杀毒软件
  4. 希尔排序c语言,希尔排序(C/C++实现)
  5. 谷歌浏览器 自动保存数据后input的黄色背景 解决办法
  6. Little Boxes UVALive - 8209
  7. nsga2算法c++实现_Bellman-Ford算法
  8. Java类初始化及实例化过程
  9. tableview插入刷新_iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码...
  10. C语言车辆管理报告,用c语言编的车辆管理
  11. android获得手机号码代码
  12. 论ul、ol和dl的区别
  13. 博客园里写blog可以添加自己的js文件
  14. 作为项目经理如何做好项目进度管理
  15. 天马行空脚踏实地,阿里巴巴有群百里挑一的天才应届生...
  16. OneDrive 开机启动设置失效如何处理?
  17. 智鼎在线测评是测什么_(详解)人才测评工具和人才测评方法
  18. 64位 window 在notepad++中添加HexEditor工具
  19. 我理解的Java栈与堆,String类
  20. Ajax传递数组对象

热门文章

  1. Unity UGUI 小知识
  2. Android性能优化之运算篇
  3. ecshop将编辑器更换为kindeditor
  4. 收集的一些操作系统面试题
  5. PDF编辑软件Nitro PDF Professional 6
  6. div实现半透明遮盖层
  7. 计算机技术与软件专业技术资格(水平)考试常见问题
  8. HDU5446:Unknown Treasure——题解
  9. HTML 常用标签全称
  10. 中国地理区域IP库整理