Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit2.0技术

本文主要是介绍Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit2.0技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://blog.csdn.net/u010046908/article/details/50767904

         最近项目做完了,有闲暇时间,一直想做一个类似微信中微信发说说,既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传。下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案(一张与多张的处理)这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能。 

  一、 首先:将photopicker到工程中
       (1)、先简单讲解一下PhotoPickerIntent的用法:          
[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. PhotoPickerIntent intent = new PhotoPickerIntent(MainActivity.this);   
  2.              intent.setSelectModel(SelectModel.MULTI); //  
  3.              intent.setShowCarema(true); // 是否显示拍照   
  4.              intent.setMaxTotal(6); // 最多选择照片数量,默认为6   
  5.              intent.setSelectedPaths(imagePaths); // 已选中的照片地址, 用于回显选中状态   
  6.              startActivityForResult(intent, REQUEST_CAMERA_CODE);  
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方法处理选中图片和预览加载适配器

[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         super.onActivityResult(requestCode, resultCode, data);  
  4.         if(resultCode == RESULT_OK) {  
  5.             switch (requestCode) {  
  6.                 // 选择照片  
  7.                 case REQUEST_CAMERA_CODE:  
  8.                     loadAdpater(data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT));  
  9.                     break;  
  10.                 // 预览  
  11.                 case REQUEST_PREVIEW_CODE:  
  12.                     loadAdpater(data.getStringArrayListExtra(PhotoPreviewActivity.EXTRA_RESULT));  
  13.                     break;  
  14.             }  
  15.         }  
  16.     }  
@Overrideprotected 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.在图片路径中默认添加一图片,用来调用需选择图库
[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. imagePaths.add("000000");  
  imagePaths.add("000000");
2.根据路径判断选中的图片。如果超过6张,默认路径从集合中移除。
[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1.  private class GridAdapter extends BaseAdapter{  
  2.         private ArrayList<String> listUrls;  
  3.         private LayoutInflater inflater;  
  4.         public GridAdapter(ArrayList<String> listUrls) {  
  5.             this.listUrls = listUrls;  
  6.             if(listUrls.size() == 7){  
  7.                 listUrls.remove(listUrls.size()-1);  
  8.             }  
  9.             inflater = LayoutInflater.from(MainActivity.this);  
  10.         }  
  11.   
  12.         public int getCount(){  
  13.             return  listUrls.size();  
  14.         }  
  15.         @Override  
  16.         public String getItem(int position) {  
  17.             return listUrls.get(position);  
  18.         }  
  19.   
  20.         @Override  
  21.         public long getItemId(int position) {  
  22.             return position;  
  23.         }  
  24.   
  25.         @Override  
  26.         public View getView(int position, View convertView, ViewGroup parent) {  
  27.             ViewHolder holder = null;  
  28.             if (convertView == null) {  
  29.                 holder = new ViewHolder();  
  30.                 convertView = inflater.inflate(R.layout.item_image, parent,false);  
  31.                 holder.image = (ImageView) convertView.findViewById(R.id.imageView);  
  32.                 convertView.setTag(holder);  
  33.             } else {  
  34.                 holder = (ViewHolder)convertView.getTag();  
  35.             }  
  36.   
  37.             final String path=listUrls.get(position);  
  38.             if (path.equals("000000")){  
  39.                 holder.image.setImageResource(R.mipmap.ic_launcher);  
  40.             }else {  
  41.                 Glide.with(MainActivity.this)  
  42.                         .load(path)  
  43.                         .placeholder(R.mipmap.default_error)  
  44.                         .error(R.mipmap.default_error)  
  45.                         .centerCrop()  
  46.                         .crossFade()  
  47.                         .into(holder.image);  
  48.             }  
  49.             return convertView;  
  50.         }  
  51.           class ViewHolder {  
  52.              ImageView image;  
  53.         }  
  54.     }  
  55. }  
 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();}@Overridepublic String getItem(int position) {return listUrls.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}}
}

三、上传管理类

[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by lidong on 2016/1/28. 
  3.  */  
  4. public class FileUploadManager {  
  5.   
  6.     private static final String ENDPOINT = "http://192.168.1.21:8080";  
  7.     private static String TAG = FileUploadManager.class.getSimpleName();  
  8.   
  9.     public interface FileUploadService {  
  10.         /** 
  11.          * 上传一张图片 
  12.          * @param description 
  13.          * @param imgs 
  14.          * @return 
  15.          */  
  16.         @Multipart  
  17.         @POST("/upload")  
  18.         Call<String> uploadImage(@Part("fileName") String description,  
  19.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs);  
  20.   
  21.   
  22.         /** 
  23.          * 上传6张图片 
  24.           * @param description 
  25.          * @param imgs1 
  26.          * @param imgs2 
  27.          * @param imgs3 
  28.          * @param imgs4 
  29.          * @param imgs5 
  30.          * @param imgs6 
  31.          * @return 
  32.          */  
  33.         @Multipart  
  34.         @POST("/upload")  
  35.         Call<String> uploadImage(@Part("description") String description,  
  36.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs1,  
  37.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs2,  
  38.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs3,  
  39.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs4,  
  40.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs5,  
  41.                                  @Part("file\"; filename=\"image.png\"") RequestBody imgs6);  
  42.   
  43.         /** 
  44.          * 简便写法 
  45.          * @param description 
  46.          * @param imgs1 
  47.          * @return 
  48.          */  
  49.         @Multipart  
  50.         @POST("/upload")  
  51.         Call<String> uploadImage(@Part("description") String description,@PartMap  
  52.                                  Map<String, RequestBody> imgs1);  
  53.     }  
  54.   
  55.     private static final Retrofit sRetrofit = new Retrofit .Builder()  
  56.             .baseUrl(ENDPOINT)  
  57.             .addConverterFactory(GsonConverterFactory.create())  
  58.             .build();  
  59.   
  60.     private static final FileUploadService apiManager = sRetrofit.create(FileUploadService.class);  
  61.   
  62.   
  63.     /** 
  64.      * 发说说 
  65.      * @param paths 
  66.      * @param desp 
  67.      */  
  68.     public static void upload(ArrayList<String> paths,String desp){  
  69.         RequestBody[] requestBody= new RequestBody[6];  
  70.         if (paths.size()>0) {  
  71.             for (int i=0;i<paths.size();i++) {  
  72.                 requestBody[i] =  
  73.                         RequestBody.create(MediaType.parse("multipart/form-data"), new File(paths.get(i)));  
  74.             }  
  75.         }  
  76.         Call<String> call = apiManager.uploadImage( desp,requestBody[0],requestBody[1],requestBody[2],requestBody[3],requestBody[4],requestBody  
  77.   
  78. [5]);  
  79.         call.enqueue(new Callback<String>() {  
  80.             @Override  
  81.             public void onResponse(Call<String> call, Response<String> response) {  
  82.                 Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");  
  83.             }  
  84.   
  85.             @Override  
  86.             public void onFailure(Call<String> call, Throwable t) {  
  87.                 Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");  
  88.             }  
  89.         });  
  90.   
  91.     }<pre name="code" class="java"/** 
  92.      * 
  93.      * @param paths 
  94.      * @param desp 
  95.      */  
  96.     public static void uploadMany(ArrayList<String> paths,String desp){  
  97.         Map<String,RequestBody> photos = new HashMap<>();  
  98.         if (paths.size()>0) {  
  99.             for (int i=0;i<paths.size();i++) {  
  100.                 String substring = paths.get(i).substring(paths.get(i).lastIndexOf("/") + 1, paths.get(i).length());  
  101.                 photos.put("file\"; filename="+substring,  RequestBody.create(MediaType.parse("multipart/form-data"), new File(paths.get(i))));  
  102.             }  
  103.         }  
  104.         Call<String> stringCall = apiManager.uploadImage(desp, photos);  
  105.         stringCall.enqueue(new Callback<String>() {  
  106.             @Override  
  107.             public void onResponse(Call<String> call, Response<String> response) {  
  108.                 Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");  
  109.             }  
  110.   
  111.             @Override  
  112.             public void onFailure(Call<String> call, Throwable t) {  
  113.                 Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");  
  114.             }  
  115.         });  
  116.     }  
/*** 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,@PartMapMap<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>() {@Overridepublic void onResponse(Call<String> call, Response<String> response) {Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");}@Overridepublic 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>() {@Overridepublic void onResponse(Call<String> call, Response<String> response) {Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");}@Overridepublic void onFailure(Call<String> call, Throwable t) {Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");}});}

 
 

四、项目代码

[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lidong.photopickersample;  
  2.   
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.AdapterView;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.Button;  
  13. import android.widget.EditText;  
  14. import android.widget.GridView;  
  15. import android.widget.ImageView;  
  16.   
  17. import com.bumptech.glide.Glide;  
  18. import com.lidong.photopicker.ImageCaptureManager;  
  19. import com.lidong.photopicker.PhotoPickerActivity;  
  20. import com.lidong.photopicker.PhotoPreviewActivity;  
  21. import com.lidong.photopicker.SelectModel;  
  22. import com.lidong.photopicker.intent.PhotoPickerIntent;  
  23. import com.lidong.photopicker.intent.PhotoPreviewIntent;  
  24.   
  25. import org.json.JSONArray;  
  26.   
  27. import java.util.ArrayList;  
  28.   
  29. /** 
  30.  * @ 
  31.  * @author lidong 
  32.  * @date 2016-02-29 
  33.  */  
  34. public class MainActivity extends AppCompatActivity {  
  35.   
  36.     private static final int REQUEST_CAMERA_CODE = 10;  
  37.     private static final int REQUEST_PREVIEW_CODE = 20;  
  38.     private ArrayList<String> imagePaths = new ArrayList<>();  
  39.     private ImageCaptureManager captureManager; // 相机拍照处理类  
  40.   
  41.     private GridView gridView;  
  42.     private GridAdapter gridAdapter;  
  43.     private Button mButton;  
  44.     private String depp;  
  45.     private EditText textView;  
  46.     private String TAG =MainActivity.class.getSimpleName();  
  47.   
  48.     @Override  
  49.     protected void onCreate(Bundle savedInstanceState) {  
  50.         super.onCreate(savedInstanceState);  
  51.         setContentView(R.layout.activity_main);  
  52.         gridView = (GridView) findViewById(R.id.gridView);  
  53.         mButton = (Button) findViewById(R.id.button);  
  54.         textView= (EditText)findViewById(R.id.et_context);  
  55.   
  56.         int cols = getResources().getDisplayMetrics().widthPixels / getResources().getDisplayMetrics().densityDpi;  
  57.         cols = cols < 3 ? 3 : cols;  
  58.         gridView.setNumColumns(cols);  
  59.   
  60.         // preview  
  61.         gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  62.             @Override  
  63.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  64.                 String imgs = (String) parent.getItemAtPosition(position);  
  65.                 if ("000000".equals(imgs) ){  
  66.                     PhotoPickerIntent intent = new PhotoPickerIntent(MainActivity.this);  
  67.                     intent.setSelectModel(SelectModel.MULTI);  
  68.                     intent.setShowCarema(true); // 是否显示拍照  
  69.                     intent.setMaxTotal(6); // 最多选择照片数量,默认为6  
  70.                     intent.setSelectedPaths(imagePaths); // 已选中的照片地址, 用于回显选中状态  
  71.                     startActivityForResult(intent, REQUEST_CAMERA_CODE);  
  72.                 }else{  
  73.                         PhotoPreviewIntent intent = new PhotoPreviewIntent(MainActivity.this);  
  74.                         intent.setCurrentItem(position);  
  75.                         intent.setPhotoPaths(imagePaths);  
  76.                         startActivityForResult(intent, REQUEST_PREVIEW_CODE);  
  77.                 }  
  78.             }  
  79.         });  
  80.         imagePaths.add("000000");  
  81.         gridAdapter = new GridAdapter(imagePaths);  
  82.         gridView.setAdapter(gridAdapter);  
  83.         mButton.setOnClickListener(new View.OnClickListener() {  
  84.             @Override  
  85.             public void onClick(View v) {  
  86.                 depp =textView.getText().toString().trim()!=null?textView.getText().toString().trim():"woowoeo";  
  87.                 new Thread(){  
  88.                     @Override  
  89.                     public void run() {  
  90.                         super.run();  
  91.                         FileUploadManager.uploadMany(imagePaths, depp);  
  92. //                        FileUploadManager.upload(imagePaths,depp);  
  93.                     }  
  94.                 }.start();  
  95.             }  
  96.         });  
  97.     }  
  98.   
  99.   
  100.     @Override  
  101.     protected void onResume() {  
  102.         super.onResume();  
  103.     }  
  104.   
  105.     @Override  
  106.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  107.         super.onActivityResult(requestCode, resultCode, data);  
  108.         if(resultCode == RESULT_OK) {  
  109.             switch (requestCode) {  
  110.                 // 选择照片  
  111.                 case REQUEST_CAMERA_CODE:  
  112.                     ArrayList<String> list = data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT);  
  113.                     Log.d(TAG, "list: " + "list = [" + list.size());  
  114.                     loadAdpater(list);  
  115.                     break;  
  116.                 // 预览  
  117.                 case REQUEST_PREVIEW_CODE:  
  118.                     ArrayList<String> ListExtra = data.getStringArrayListExtra(PhotoPreviewActivity.EXTRA_RESULT);  
  119.                     Log.d(TAG, "ListExtra: " + "ListExtra = [" + ListExtra.size());  
  120.                     loadAdpater(ListExtra);  
  121.                     break;  
  122.             }  
  123.         }  
  124.     }  
  125.   
  126.     private void loadAdpater(ArrayList<String> paths){  
  127.         if (imagePaths!=null&& imagePaths.size()>0){  
  128.             imagePaths.clear();  
  129.         }  
  130.         if (paths.contains("000000")){  
  131.             paths.remove("000000");  
  132.         }  
  133.         paths.add("000000");  
  134.         imagePaths.addAll(paths);  
  135.         gridAdapter  = new GridAdapter(imagePaths);  
  136.         gridView.setAdapter(gridAdapter);  
  137.         try{  
  138.             JSONArray obj = new JSONArray(imagePaths);  
  139.             Log.e("--", obj.toString());  
  140.         }catch (Exception e){  
  141.             e.printStackTrace();  
  142.         }  
  143.     }  
  144.   
  145.     private class GridAdapter extends BaseAdapter{  
  146.         private ArrayList<String> listUrls;  
  147.         private LayoutInflater inflater;  
  148.         public GridAdapter(ArrayList<String> listUrls) {  
  149.             this.listUrls = listUrls;  
  150.             if(listUrls.size() == 7){  
  151.                 listUrls.remove(listUrls.size()-1);  
  152.             }  
  153.             inflater = LayoutInflater.from(MainActivity.this);  
  154.         }  
  155.   
  156.         public int getCount(){  
  157.             return  listUrls.size();  
  158.         }  
  159.         @Override  
  160.         public String getItem(int position) {  
  161.             return listUrls.get(position);  
  162.         }  
  163.   
  164.         @Override  
  165.         public long getItemId(int position) {  
  166.             return position;  
  167.         }  
  168.   
  169.         @Override  
  170.         public View getView(int position, View convertView, ViewGroup parent) {  
  171.             ViewHolder holder = null;  
  172.             if (convertView == null) {  
  173.                 holder = new ViewHolder();  
  174.                 convertView = inflater.inflate(R.layout.item_image, parent,false);  
  175.                 holder.image = (ImageView) convertView.findViewById(R.id.imageView);  
  176.                 convertView.setTag(holder);  
  177.             } else {  
  178.                 holder = (ViewHolder)convertView.getTag();  
  179.             }  
  180.   
  181.             final String path=listUrls.get(position);  
  182.             if (path.equals("000000")){  
  183.                 holder.image.setImageResource(R.mipmap.ic_launcher);  
  184.             }else {  
  185.                 Glide.with(MainActivity.this)  
  186.                         .load(path)  
  187.                         .placeholder(R.mipmap.default_error)  
  188.                         .error(R.mipmap.default_error)  
  189.                         .centerCrop()  
  190.                         .crossFade()  
  191.                         .into(holder.image);  
  192.             }  
  193.             return convertView;  
  194.         }  
  195.           class ViewHolder {  
  196.              ImageView image;  
  197.         }  
  198.     }  
  199. }  
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();@Overrideprotected 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);// previewgridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic 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); // 最多选择照片数量,默认为6intent.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() {@Overridepublic void onClick(View v) {depp =textView.getText().toString().trim()!=null?textView.getText().toString().trim():"woowoeo";new Thread(){@Overridepublic void run() {super.run();FileUploadManager.uploadMany(imagePaths, depp);
//                        FileUploadManager.upload(imagePaths,depp);}}.start();}});}@Overrideprotected void onResume() {super.onResume();}@Overrideprotected 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();}@Overridepublic String getItem(int position) {return listUrls.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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
[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;">@RequestMapping("/upload"   )    
  2.     public String addUser(@RequestParam("file") CommonsMultipartFile[] files,  
  3.             HttpServletRequest request){    
  4.             
  5.         for(int i = 0;i<files.length;i++){    
  6.             System.out.println("fileName---------->" + files[i].getOriginalFilename());    
  7.             
  8.             if(!files[i].isEmpty()){    
  9.                 int pre = (int) System.currentTimeMillis();    
  10.                 try {    
  11.                     //拿到输出流,同时重命名上传的文件    
  12.                     FileOutputStream os = new FileOutputStream("f:/img"+"/" + new Date().getTime()+".jpg");    
  13.                     //拿到上传文件的输入流    
  14.                     FileInputStream in = (FileInputStream) files[i].getInputStream();    
  15.                         
  16.                     //以写字节的方式写文件    
  17.                     int b = 0;    
  18.                     while((b=in.read()) != -1){    
  19.                         os.write(b);    
  20.                     }    
  21.                     os.flush();    
  22.                     os.close();    
  23.                     in.close();    
  24.                     int finaltime = (int) System.currentTimeMillis();    
  25.                     System.out.println(finaltime - pre);    
  26.                         
  27.                 } catch (Exception e) {    
  28.                     e.printStackTrace();    
  29.                     System.out.println("上传出错");    
  30.                 }    
  31.         }    
  32.         }    
  33.         return "/success";    
  34.     }  </span>  
<span style="font-size:18px;">@RequestMapping("/upload"   )  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";  }  </span>


六、Struts2接收文件

[java] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;color:#ff6666;">@Controller   
  2. public class UploadFile extends ActionSupport {  
  3.   
  4.  /** 
  5.  *  
  6.  */  
  7. private static final long serialVersionUID = 1L;  
  8.   
  9. private File[] file;//文件数组  
  10. private String description;//说说内容  
  11. public File[] getFile() {  
  12.     return file;  
  13. }  
  14. public void setFile(File[] file) {  
  15.     this.file = file;  
  16. }  
  17.   
  18.   
  19. public String getDescription() {  
  20.     return description;  
  21. }  
  22. public void setDescription(String description) {  
  23.     this.description = description;  
  24. }  
  25. @Action("/upload")  
  26. public void upload()  {  
  27.     System.out.println("上传的文件="+Arrays.toString(file));  
  28.     System.out.println("说说内容="+description);  
  29. }  
  30. }</span>  
<span style="font-size:18px;color:#ff6666;">@Controller 
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);
}
}</span>



项目下载地址



效果展示




如果在看的过程中,有问题可以QQ联系,1561281670

这篇关于Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit2.0技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354069

相关文章

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源