您的位置:首页 > 移动开发 > Android开发

多选本地相册中的图片并展示(仿QQ空间动态发送页面)上传至服务器

2017-04-12 16:38 267 查看
最近公司项目需要从本地上传图片到服务器,直接去找才发现安卓居然还有这么坑的时候,调用原生的只能选择一张图片,而且还没有任何的细节优化,触摸图片就直接返回了。这肯定不行啊!于是就在网上找啊找。。。找啊找。。。有很多都写得花里胡哨的看不懂,而且界面的UI也是low的不行。。终于还是找到一个很好的demo,仿照QQ空间的样式。哎,这就很舒服。在此贴上来给自己一个提醒。

参照上一篇博客直接作为moudle导入使用才是真的美滋滋~~
http://www.cnblogs.com/linjzong/p/4629800.html
前段时间在做一个动态发布功能,需要用到图片上传。一开始直接调用的系统相册和相机,由于系统相机不支持多选,就花点时间做了个本地相册,在此开源下。

先上截图,依次为选择相册界面、相册详情界面、查看图片大图界面


 

 


相册列表按图片数量降序排序,相册详情列表按图片时间降序排序,对比了下微信和QQ的相册,读取的文件基本一致。

接下来说下相册文件遍历的思路。首先肯定不会是通过文件夹逐级遍历的,这样效率太低。查了下API发现Android的系统数据库已经存储了所有的图片路径和缩略图路径(如果有),可直接通过ContentProvider来获取,获取大图的URI是
MediaStore.Images.Media.EXTERNAL_CONTENT_URI


获取缩略图的URI是
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI


我的做法是先遍历所有大图,获取ID和路径,再通过大图的ID去查找缩略图路径,在相册中显示的都是缩略图,这样可以提高显示速度,同时减少内存开销。但是通过大图ID去查找缩略图这一步是需要消耗一点时间的,因此将它在App启动时,开启线程执行。LocalImageHelper类用以执行该操作。

待完善点:相册的初始化是放在应用启动时,初始化一次后就不再重新执行,因此假如在应用开启后,设备内添加了新的图片或删除了图片,应用内缓存的相册仍然不会改变,下一步可以在每次打开相册时和本地图片做一次对比,对新增的和删除的图片做一个更新。

Demo中使用了ImageLoader库来展示图片,使用的是Android Studio开发。

 

GitHub地址:https://github.com/LinJZong/LocalAlbum.git

demo中onActivityResult方法里:



pathList就是我定义的一个集合用来存读到的原图的物理地址,因为展示的时候是缩略图但是你给服务器发送的话肯定要传大图,两个log的打印如下:



拿到地址之后写了个updateImage(String descript, List<String> list)方法

第一个参数是用来获取发送动态的EditText里的内容,第二个list就是pathList



然后通过pathList去循环的创建新的图片File对象存到一个list里面去发给服务器

params.setMultipart(true);

这句话一定要有,因为xutils的原理还是去模仿了浏览器表单的样式去给服务器发送(目前我是这么理解的),所以不设置为true的话服务器是不能接受文件的哟~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐