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虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.