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

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

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

  一、 首先:将photopicker到工程中
       (1)、先简单讲解一下PhotoPickerIntent的用法:          
  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方法处理选中图片和预览加载适配器

  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.     }  
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK) {
            switch (requestCode) {
                // 选择照片
                case REQUEST_CAMERA_CODE:
                    loadAdpater(data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT));
                    break;
                // 预览
                case REQUEST_PREVIEW_CODE:
                    loadAdpater(data.getStringArrayListExtra(PhotoPreviewActivity.EXTRA_RESULT));
                    break;
            }
        }
    }

 二、重点在GridAdapter
1.在图片路径中默认添加一图片,用来调用需选择图库
  1. imagePaths.add("000000");  
  imagePaths.add("000000");
2.根据路径判断选中的图片。如果超过6张,默认路径从集合中移除。
  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();
        }
        @Override
        public String getItem(int position) {
            return listUrls.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.item_image, parent,false);
                holder.image = (ImageView) convertView.findViewById(R.id.imageView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }

            final String path=listUrls.get(position);
            if (path.equals("000000")){
                holder.image.setImageResource(R.mipmap.ic_launcher);
            }else {
                Glide.with(MainActivity.this)
                        .load(path)
                        .placeholder(R.mipmap.default_error)
                        .error(R.mipmap.default_error)
                        .centerCrop()
                        .crossFade()
                        .into(holder.image);
            }
            return convertView;
        }
          class ViewHolder {
             ImageView image;
        }
    }
}

三、上传管理类

  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,@PartMap
                                 Map<String, RequestBody> imgs1);
    }

    private static final Retrofit sRetrofit = new Retrofit .Builder()
            .baseUrl(ENDPOINT)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    private static final FileUploadService apiManager = sRetrofit.create(FileUploadService.class);


    /**
     * 发说说
     * @param paths
     * @param desp
     */
    public static void upload(ArrayList<String> paths,String desp){
        RequestBody[] requestBody= new RequestBody[6];
        if (paths.size()>0) {
            for (int i=0;i<paths.size();i++) {
                requestBody[i] =
                        RequestBody.create(MediaType.parse("multipart/form-data"), new File(paths.get(i)));
            }
        }
        Call<String> call = apiManager.uploadImage( desp,requestBody[0],requestBody[1],requestBody[2],requestBody[3],requestBody[4],requestBody

[5]);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");
            }
        });

    }<pre name="code" class="java"> /**
     *
     * @param paths
     * @param desp
     */
    public static void uploadMany(ArrayList<String> paths,String desp){
        Map<String,RequestBody> photos = new HashMap<>();
        if (paths.size()>0) {
            for (int i=0;i<paths.size();i++) {
                String substring = paths.get(i).substring(paths.get(i).lastIndexOf("/") + 1, paths.get(i).length());
                photos.put("file\"; filename="+substring,  RequestBody.create(MediaType.parse("multipart/form-data"), new File(paths.get(i))));
            }
        }
        Call<String> stringCall = apiManager.uploadImage(desp, photos);
        stringCall.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");
            }
        });
    }

 
  
 
  

四、项目代码

  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();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridView = (GridView) findViewById(R.id.gridView);
        mButton = (Button) findViewById(R.id.button);
        textView= (EditText)findViewById(R.id.et_context);

        int cols = getResources().getDisplayMetrics().widthPixels / getResources().getDisplayMetrics().densityDpi;
        cols = cols < 3 ? 3 : cols;
        gridView.setNumColumns(cols);

        // preview
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String imgs = (String) parent.getItemAtPosition(position);
                if ("000000".equals(imgs) ){
                    PhotoPickerIntent intent = new PhotoPickerIntent(MainActivity.this);
                    intent.setSelectModel(SelectModel.MULTI);
                    intent.setShowCarema(true); // 是否显示拍照
                    intent.setMaxTotal(6); // 最多选择照片数量,默认为6
                    intent.setSelectedPaths(imagePaths); // 已选中的照片地址, 用于回显选中状态
                    startActivityForResult(intent, REQUEST_CAMERA_CODE);
                }else{
                        PhotoPreviewIntent intent = new PhotoPreviewIntent(MainActivity.this);
                        intent.setCurrentItem(position);
                        intent.setPhotoPaths(imagePaths);
                        startActivityForResult(intent, REQUEST_PREVIEW_CODE);
                }
            }
        });
        imagePaths.add("000000");
        gridAdapter = new GridAdapter(imagePaths);
        gridView.setAdapter(gridAdapter);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                depp =textView.getText().toString().trim()!=null?textView.getText().toString().trim():"woowoeo";
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        FileUploadManager.uploadMany(imagePaths, depp);
//                        FileUploadManager.upload(imagePaths,depp);
                    }
                }.start();
            }
        });
    }


    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK) {
            switch (requestCode) {
                // 选择照片
                case REQUEST_CAMERA_CODE:
                    ArrayList<String> list = data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT);
                    Log.d(TAG, "list: " + "list = [" + list.size());
                    loadAdpater(list);
                    break;
                // 预览
                case REQUEST_PREVIEW_CODE:
                    ArrayList<String> ListExtra = data.getStringArrayListExtra(PhotoPreviewActivity.EXTRA_RESULT);
                    Log.d(TAG, "ListExtra: " + "ListExtra = [" + ListExtra.size());
                    loadAdpater(ListExtra);
                    break;
            }
        }
    }

    private void loadAdpater(ArrayList<String> paths){
        if (imagePaths!=null&& imagePaths.size()>0){
            imagePaths.clear();
        }
        if (paths.contains("000000")){
            paths.remove("000000");
        }
        paths.add("000000");
        imagePaths.addAll(paths);
        gridAdapter  = new GridAdapter(imagePaths);
        gridView.setAdapter(gridAdapter);
        try{
            JSONArray obj = new JSONArray(imagePaths);
            Log.e("--", obj.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private class GridAdapter extends BaseAdapter{
        private ArrayList<String> listUrls;
        private LayoutInflater inflater;
        public GridAdapter(ArrayList<String> listUrls) {
            this.listUrls = listUrls;
            if(listUrls.size() == 7){
                listUrls.remove(listUrls.size()-1);
            }
            inflater = LayoutInflater.from(MainActivity.this);
        }

        public int getCount(){
            return  listUrls.size();
        }
        @Override
        public String getItem(int position) {
            return listUrls.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.item_image, parent,false);
                holder.image = (ImageView) convertView.findViewById(R.id.imageView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }

            final String path=listUrls.get(position);
            if (path.equals("000000")){
                holder.image.setImageResource(R.mipmap.ic_launcher);
            }else {
                Glide.with(MainActivity.this)
                        .load(path)
                        .placeholder(R.mipmap.default_error)
                        .error(R.mipmap.default_error)
                        .centerCrop()
                        .crossFade()
                        .into(holder.image);
            }
            return convertView;
        }
          class ViewHolder {
             ImageView image;
        }
    }
}


五、SpringMVC接收文件的action
  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接收文件

  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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android使用 Retrofit 上传图片可以通过 `@Multipart` 和 `@Part` 注解实现。以下是 Retrofit 2.0 实现图文上传的方法总结: 1. 添加依赖库 在项目的 `build.gradle` 文件中添加以下依赖库: ```groovy implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' ``` 2. 创建 Retrofit 实例 ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); ``` 3. 创建 API 接口 ```java public interface ApiService { @Multipart @POST("upload") Call<ResponseBody> upload( @Part("description") RequestBody description, @Part MultipartBody.Part file); } ``` 其中,`@Multipart` 注解表示这是一个包含文本和文件的表单;`@POST("upload")` 表示上传的 URL 地址;`@Part("description") RequestBody description` 表示上传的文本参数,`description` 是参数名,可以自己定义;`@Part MultipartBody.Part file` 表示上传的文件参数。 4. 创建请求参数 ```java File file = new File(filePath); RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), "description"); ``` 5. 发送网络请求 ```java ApiService apiService = retrofit.create(ApiService.class); Call<ResponseBody> call = apiService.upload(description, body); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // 成功上传后的处理 } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { // 上传失败后的处理 } }); ``` 以上就是 Retrofit 2.0 实现图文上传的方法总结。注意,在 `AndroidManifest.xml` 文件中需要添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值