Android使用Retrofit2.0技术仿微信发说说
程序员文章站
2024-02-17 15:38:46
最近项目做完了,有闲暇时间,一直想做一个类似微信中微信发说说,既能实现拍照,选图库,多图案上传的案例,目前好多app都有类似微信朋友圈的功能,能过发表说说等附带图片上传。下...
最近项目做完了,有闲暇时间,一直想做一个类似微信中微信发说说,既能实现拍照,选图库,多图案上传的案例,目前好多app都有类似微信朋友圈的功能,能过发表说说等附带图片上传。下面的就是实现该功能的过程:大家还没有看过android retrofit 2.0框架上传图片解决方案(一张与多张的处理)这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能。
一、 首先:将photopicker到工程中
(1)、先简单讲解一下photopickerintent的用法:
photopickerintent intent = new photopickerintent(mainactivity.this); intent.setselectmodel(selectmodel.multi); // intent.setshowcarema(true); // 是否显示拍照 intent.setmaxtotal(6); // 最多选择照片数量,默认为6 intent.setselectedpaths(imagepaths); // 已选中的照片地址, 用于回显选中状态 startactivityforresult(intent, request_camera_code);
(2)、设置好之后,重写onactivityresult方法处理选中图片和预览加载适配器
@override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if(resultcode == result_ok) { switch (requestcode) { // 选择照片 case request_camera_code: loadadpater(data.getstringarraylistextra(photopickeractivity.extra_result)); break; // 预览 case request_preview_code: loadadpater(data.getstringarraylistextra(photopreviewactivity.extra_result)); break; } } }
二、重点在gridadapter
1.在图片路径中默认添加一图片,用来调用需选择图库
imagepaths.add("000000");
2.根据路径判断选中的图片。如果超过6张,默认路径从集合中移除。
private class gridadapter extends baseadapter{ private arraylist<string> listurls; private layoutinflater inflater; public gridadapter(arraylist<string> listurls) { this.listurls = listurls; if(listurls.size() == 7){ listurls.remove(listurls.size()-1); } inflater = layoutinflater.from(mainactivity.this); } public int getcount(){ return listurls.size(); } @override public string getitem(int position) { return listurls.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder holder = null; if (convertview == null) { holder = new viewholder(); convertview = inflater.inflate(r.layout.item_image, parent,false); holder.image = (imageview) convertview.findviewbyid(r.id.imageview); convertview.settag(holder); } else { holder = (viewholder)convertview.gettag(); } final string path=listurls.get(position); if (path.equals("000000")){ holder.image.setimageresource(r.mipmap.ic_launcher); }else { glide.with(mainactivity.this) .load(path) .placeholder(r.mipmap.default_error) .error(r.mipmap.default_error) .centercrop() .crossfade() .into(holder.image); } return convertview; } class viewholder { imageview image; } } }
三、上传管理类
/** * created by lidong on 2016/1/28. */ public class fileuploadmanager { private static final string endpoint = "http://192.168.1.21:8080"; private static string tag = fileuploadmanager.class.getsimplename(); public interface fileuploadservice { /** * 上传一张图片 * @param description * @param imgs * @return */ @multipart @post("/upload") call<string> uploadimage(@part("filename") string description, @part("file\"; filename=\"image.png\"") requestbody imgs); /** * 上传6张图片 * @param description * @param imgs1 * @param imgs2 * @param imgs3 * @param imgs4 * @param imgs5 * @param imgs6 * @return */ @multipart @post("/upload") call<string> uploadimage(@part("description") string description, @part("file\"; filename=\"image.png\"") requestbody imgs1, @part("file\"; filename=\"image.png\"") requestbody imgs2, @part("file\"; filename=\"image.png\"") requestbody imgs3, @part("file\"; filename=\"image.png\"") requestbody imgs4, @part("file\"; filename=\"image.png\"") requestbody imgs5, @part("file\"; filename=\"image.png\"") requestbody imgs6); /** * 简便写法 * @param description * @param imgs1 * @return */ @multipart @post("/upload") call<string> uploadimage(@part("description") string description,@partmap map<string, requestbody> imgs1); } private static final retrofit sretrofit = new retrofit .builder() .baseurl(endpoint) .addconverterfactory(gsonconverterfactory.create()) .build(); private static final fileuploadservice apimanager = sretrofit.create(fileuploadservice.class); /** * 发说说 * @param paths * @param desp */ public static void upload(arraylist<string> paths,string desp){ requestbody[] requestbody= new requestbody[6]; if (paths.size()>0) { for (int i=0;i<paths.size();i++) { requestbody[i] = requestbody.create(mediatype.parse("multipart/form-data"), new file(paths.get(i))); } } call<string> call = apimanager.uploadimage( desp,requestbody[0],requestbody[1],requestbody[2],requestbody[3],requestbody[4],requestbody [5]); call.enqueue(new callback<string>() { @override public void onresponse(call<string> call, response<string> response) { log.d(tag, "onresponse() called with: " + "call = [" + call + "], response = [" + response + "]"); } @override public void onfailure(call<string> call, throwable t) { log.d(tag, "onfailure() called with: " + "call = [" + call + "], t = [" + t + "]"); } }); }<pre name="code" class="java"> /** * * @param paths * @param desp */ public static void uploadmany(arraylist<string> paths,string desp){ map<string,requestbody> photos = new hashmap<>(); if (paths.size()>0) { for (int i=0;i<paths.size();i++) { string substring = paths.get(i).substring(paths.get(i).lastindexof("/") + 1, paths.get(i).length()); photos.put("file\"; filename="+substring, requestbody.create(mediatype.parse("multipart/form-data"), new file(paths.get(i)))); } } call<string> stringcall = apimanager.uploadimage(desp, photos); stringcall.enqueue(new callback<string>() { @override public void onresponse(call<string> call, response<string> response) { log.d(tag, "onresponse() called with: " + "call = [" + call + "], response = [" + response + "]"); } @override public void onfailure(call<string> call, throwable t) { log.d(tag, "onfailure() called with: " + "call = [" + call + "], t = [" + t + "]"); } }); }
四、项目代码
package com.lidong.photopickersample; import android.content.intent; import android.os.bundle; import android.support.v7.app.appcompatactivity; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.adapterview; import android.widget.baseadapter; import android.widget.button; import android.widget.edittext; import android.widget.gridview; import android.widget.imageview; import com.bumptech.glide.glide; import com.lidong.photopicker.imagecapturemanager; import com.lidong.photopicker.photopickeractivity; import com.lidong.photopicker.photopreviewactivity; import com.lidong.photopicker.selectmodel; import com.lidong.photopicker.intent.photopickerintent; import com.lidong.photopicker.intent.photopreviewintent; import org.json.jsonarray; import java.util.arraylist; /** * @ * @author lidong * @date 2016-02-29 */ public class mainactivity extends appcompatactivity { private static final int request_camera_code = 10; private static final int request_preview_code = 20; private arraylist<string> imagepaths = new arraylist<>(); private imagecapturemanager capturemanager; // 相机拍照处理类 private gridview gridview; private gridadapter gridadapter; private button mbutton; private string depp; private edittext textview; private string tag =mainactivity.class.getsimplename(); @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); gridview = (gridview) findviewbyid(r.id.gridview); mbutton = (button) findviewbyid(r.id.button); textview= (edittext)findviewbyid(r.id.et_context); int cols = getresources().getdisplaymetrics().widthpixels / getresources().getdisplaymetrics().densitydpi; cols = cols < 3 ? 3 : cols; gridview.setnumcolumns(cols); // preview gridview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { string imgs = (string) parent.getitematposition(position); if ("000000".equals(imgs) ){ photopickerintent intent = new photopickerintent(mainactivity.this); intent.setselectmodel(selectmodel.multi); intent.setshowcarema(true); // 是否显示拍照 intent.setmaxtotal(6); // 最多选择照片数量,默认为6 intent.setselectedpaths(imagepaths); // 已选中的照片地址, 用于回显选中状态 startactivityforresult(intent, request_camera_code); }else{ photopreviewintent intent = new photopreviewintent(mainactivity.this); intent.setcurrentitem(position); intent.setphotopaths(imagepaths); startactivityforresult(intent, request_preview_code); } } }); imagepaths.add("000000"); gridadapter = new gridadapter(imagepaths); gridview.setadapter(gridadapter); mbutton.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { depp =textview.gettext().tostring().trim()!=null?textview.gettext().tostring().trim():"woowoeo"; new thread(){ @override public void run() { super.run(); fileuploadmanager.uploadmany(imagepaths, depp); // fileuploadmanager.upload(imagepaths,depp); } }.start(); } }); } @override protected void onresume() { super.onresume(); } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if(resultcode == result_ok) { switch (requestcode) { // 选择照片 case request_camera_code: arraylist<string> list = data.getstringarraylistextra(photopickeractivity.extra_result); log.d(tag, "list: " + "list = [" + list.size()); loadadpater(list); break; // 预览 case request_preview_code: arraylist<string> listextra = data.getstringarraylistextra(photopreviewactivity.extra_result); log.d(tag, "listextra: " + "listextra = [" + listextra.size()); loadadpater(listextra); break; } } } private void loadadpater(arraylist<string> paths){ if (imagepaths!=null&& imagepaths.size()>0){ imagepaths.clear(); } if (paths.contains("000000")){ paths.remove("000000"); } paths.add("000000"); imagepaths.addall(paths); gridadapter = new gridadapter(imagepaths); gridview.setadapter(gridadapter); try{ jsonarray obj = new jsonarray(imagepaths); log.e("--", obj.tostring()); }catch (exception e){ e.printstacktrace(); } } private class gridadapter extends baseadapter{ private arraylist<string> listurls; private layoutinflater inflater; public gridadapter(arraylist<string> listurls) { this.listurls = listurls; if(listurls.size() == 7){ listurls.remove(listurls.size()-1); } inflater = layoutinflater.from(mainactivity.this); } public int getcount(){ return listurls.size(); } @override public string getitem(int position) { return listurls.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder holder = null; if (convertview == null) { holder = new viewholder(); convertview = inflater.inflate(r.layout.item_image, parent,false); holder.image = (imageview) convertview.findviewbyid(r.id.imageview); convertview.settag(holder); } else { holder = (viewholder)convertview.gettag(); } final string path=listurls.get(position); if (path.equals("000000")){ holder.image.setimageresource(r.mipmap.ic_launcher); }else { glide.with(mainactivity.this) .load(path) .placeholder(r.mipmap.default_error) .error(r.mipmap.default_error) .centercrop() .crossfade() .into(holder.image); } return convertview; } class viewholder { imageview image; } } }
五、springmvc接收文件的action
public string adduser(@requestparam("file") commonsmultipartfile[] files, httpservletrequest request){ for(int i = 0;i<files.length;i++){ system.out.println("filename---------->" + files[i].getoriginalfilename()); if(!files[i].isempty()){ int pre = (int) system.currenttimemillis(); try { //拿到输出流,同时重命名上传的文件 fileoutputstream os = new fileoutputstream("f:/img"+"/" + new date().gettime()+".jpg"); //拿到上传文件的输入流 fileinputstream in = (fileinputstream) files[i].getinputstream(); //以写字节的方式写文件 int b = 0; while((b=in.read()) != -1){ os.write(b); } os.flush(); os.close(); in.close(); int finaltime = (int) system.currenttimemillis(); system.out.println(finaltime - pre); } catch (exception e) { e.printstacktrace(); system.out.println("上传出错"); } } } return "/success"; }
六、struts2接收文件
public class uploadfile extends actionsupport { /** * */ private static final long serialversionuid = 1l; private file[] file;//文件数组 private string description;//说说内容 public file[] getfile() { return file; } public void setfile(file[] file) { this.file = file; } public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } @action("/upload") public void upload() { system.out.println("上传的文件="+arrays.tostring(file)); system.out.println("说说内容="+description); } }
项目下载地址:https://github.com/lidong1665/android-uploadmultipartimage
效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android使用Retrofit2.0技术仿微信发说说
-
Android仿微信发朋友圈浏览图片效果
-
Android仿微信界面--使用Fragment实现(慕课网笔记) 博客分类: Android android
-
Android中使用GridView实现仿微信图片上传功能(附源代码)
-
Android中使用GridView实现仿微信图片上传功能(附源代码)
-
Android中使用PopupWindow 仿微信点赞和评论弹出
-
Android仿微信菜单(Menu)(使用C#和Java分别实现)
-
Android开发:使用android共享元素转场动画仿微信朋友圈图片预览功能
-
Android中使用PopupWindow 仿微信点赞和评论弹出
-
Android仿微信菜单(Menu)(使用C#和Java分别实现)