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

转自  http://blog.csdn.net/u010046908/article/details/50767904

接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能。 

  一、 首先:将photopicker到工程中
       (1)、先简单讲解一下PhotoPickerIntent的用法:          
[java]  view plain  copy
  在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);  
        (2)、设置好之后,重写onActivityResult方法处理选中图片和预览加载适配器

[java]  view plain  copy
  在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.     }  

 二、重点在GridAdapter
1.在图片路径中默认添加一图片,用来调用需选择图库
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. imagePaths.add("000000");  
2.根据路径判断选中的图片。如果超过6张,默认路径从集合中移除。
[java]  view plain  copy
  在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. }  

三、上传管理类

[java]  view plain  copy
  在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.     }  
  92.   
  93.     /** 
  94.      * 
  95.      * @param paths 
  96.      * @param desp 
  97.      */  
  98.     public static void uploadMany(ArrayList<String> paths,String desp){  
  99.         Map<String,RequestBody> photos = new HashMap<>();  
  100.         if (paths.size()>0) {  
  101.             for (int i=0;i<paths.size();i++) {  
  102.                 photos.put("photos"+i+"\"; filename=\"icon.png",  RequestBody.create(MediaType.parse("multipart/form-data"), new File(paths.get  
  103.   
  104. (i))));  
  105.             }  
  106.         }  
  107.         Call<String> stringCall = apiManager.uploadImage(desp, photos);  
  108.         stringCall.enqueue(new Callback<String>() {  
  109.             @Override  
  110.             public void onResponse(Call<String> call, Response<String> response) {  
  111.                 Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");  
  112.             }  
  113.   
  114.             @Override  
  115.             public void onFailure(Call<String> call, Throwable t) {  
  116.                 Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");  
  117.             }  
  118.         });  
  119.     }  
  120. }  

四、项目代码

[java]  view plain  copy
  在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. }  

项目下载地址

效果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值