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实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义