当前位置: 移动技术网 > IT编程>移动开发>Android > Android使用Retrofit2.0技术仿微信发说说

Android使用Retrofit2.0技术仿微信发说说

2019年07月24日  | 移动技术网IT编程  | 我要评论

成品油价格走势,鹊桥汇,林忆莲歌曲

最近项目做完了,有闲暇时间,一直想做一个类似微信中微信发说说,既能实现拍照,选图库,多图案上传的案例,目前好多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

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网