最近项目中涉及到了上传多张图片到服务器,于是写了一个简单的demo和大家分享。

源码下载地址 http://download.csdn.net/detail/lzq520210/9353663

需要注意的是,本项目是用androidstudio开发的,build.gradle文件如下:

apply plugin: 'com.android.application'android {    compileSdkVersion 23    buildToolsVersion "21.1.2"    defaultConfig {        applicationId "com.example.imagedemo"        minSdkVersion 10        targetSdkVersion 23        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }    useLibrary 'org.apache.http.legacy'}dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:21.1.2'    compile 'com.android.support:design:23.1.1'    compile files('libs/android-async-http-1.4.6.jar')    compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'}

代码如下:

package com.example.imagedemo;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable;import android.media.ExifInterface;import android.media.ThumbnailUtils;import android.net.Uri;import android.os.AsyncTask;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.preference.PreferenceActivity;import android.provider.MediaStore;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.DisplayMetrics;import android.util.Log;import android.view.Display;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.GridView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.List;import java.util.Random;import org.apache.http.Header;public class MainActivity extends AppCompatActivity {    private List<Bitmap> gridViewBitmap = new ArrayList<>();    private GridViewAdapter adapter;    private static final int CAMERA_SELECT_CODE = 111;// 照相机拍摄    public static final String CAMERA_DIR_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();// 拍照照片保存的目录    public static File mCurrentFilePath = new File(CAMERA_DIR_PATH + createFileName());// 当前图片写入的文件路径    private int _scaleWidth = 420;    private int _scaleHeight = 550;    private GridView mGridview;    private boolean isShowDelete = false;    private BitmapFactory.Options opts;    private PopupWindow popWindow;    private LayoutInflater layoutInflater;    LinearLayout cancel;    private TextView photograph,albums;    private ArrayList<String>  list=new ArrayList<>();    private Button upload;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mGridview = (GridView) findViewById(R.id.gridview);        upload = ((Button) findViewById(R.id.upload));        upload.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                try {                    postFile(list);                } catch (Exception e) {                    e.printStackTrace();                }            }        });        gridViewBitmap.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_add_image));//带减号 添加此行代码//        gridViewBitmap.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_add_image));        adapter = new GridViewAdapter();        mGridview.setAdapter(adapter);    }    class GridViewAdapter extends BaseAdapter {        @Override        public int getCount() {            return gridViewBitmap.size();        }        @Override        public Object getItem(int position) {            return gridViewBitmap.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(final int position, View convertView, final ViewGroup parent) {            ViewHolder holder = new ViewHolder();            if (convertView == null) {                convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.gridviewitem, null);                holder.itemImage = (ImageView) convertView.findViewById(R.id.gridview_image);                holder.itemImageDelete = (ImageView) convertView.findViewById(R.id.gridview_dele);                convertView.setTag(holder);            } else {                holder = (ViewHolder) convertView.getTag();            }            Log.i("TAG",gridViewBitmap.get(position)+"");            if (gridViewBitmap!=null){            holder.itemImage.setImageBitmap(gridViewBitmap.get(position));            }//            if (isShowDelete) {//                holder.itemImageDelete.setVisibility(View.VISIBLE);//            } else {//                holder.itemImageDelete.setVisibility(View.GONE);//            }            holder.itemImageDelete.setVisibility(View.VISIBLE);            if (position == gridViewBitmap.size() - 1) {                holder.itemImageDelete.setVisibility(View.GONE);                holder.itemImage.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        showpwdwindow();//                        showPopupWindow(parent);                    }                });            }            //点击减号时 是、所有图片上方显示小减号//            else if (position == gridViewBitmap.size() - 2) {//                holder.itemImageDelete.setVisibility(View.GONE);//                holder.itemImage.setOnClickListener(new View.OnClickListener() {//                    @Override//                    public void onClick(View v) {////                        showpwdwindow();//                        Toast.makeText(MainActivity.this, "减号被点击", Toast.LENGTH_SHORT).show();//                        if (isShowDelete) {//                            isShowDelete = false;//                        } else {//                            isShowDelete = true;//                        }//                        notifyDataSetChanged();//                    }//                });//            }            else {                holder.itemImage.setOnClickListener(null);            }            holder.itemImageDelete.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    gridViewBitmap.remove(position);                    list.remove(position);                    adapter.notifyDataSetChanged();                    Log.i("----list.size()----",list.size()+"");                }            });            return convertView;        }        class ViewHolder {            private ImageView itemImage;            private ImageView itemImageDelete;        }    }    private void showpwdwindow() {        // popwindows加载布局        layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);        View localView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop_choose_pic, null);        final PopupWindow localPopupWindow = new PopupWindow(localView, -1, -1, true);        localPopupWindow.setBackgroundDrawable(new BitmapDrawable());        localPopupWindow.setOutsideTouchable(true);        localPopupWindow.showAtLocation(mGridview, 119, 0, 0);        ((TextView) localView.findViewById(R.id.gallery)).setOnClickListener(new View.OnClickListener() {            public void onClick(View paramAnonymousView) {                // this.getCamera(localPopupWindow);                showCamera();                localPopupWindow.dismiss();            }        });        ((TextView) localView.findViewById(R.id.photo)).setOnClickListener(new View.OnClickListener() {            public void onClick(View paramAnonymousView) {                showAlbums();                localPopupWindow.dismiss();            }        });        ((TextView) localView.findViewById(R.id.cancel)).setOnClickListener(new View.OnClickListener() {            public void onClick(View paramAnonymousView) {                localPopupWindow.dismiss();            }        });    }    @Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) {// 相册            if (requestCode == CAMERA_SELECT_CODE) {// 照相机                Bitmap image = createThumb(mCurrentFilePath.getAbsolutePath());                Log.i("-----照相机url", mCurrentFilePath.getAbsolutePath());                Collections.reverse(gridViewBitmap);                gridViewBitmap.add(image);                list.add(mCurrentFilePath.getAbsolutePath());                Collections.reverse(gridViewBitmap);                adapter.notifyDataSetChanged();            } else if (requestCode == 3000) {                Uri uri = data.getData();                String path = getPath(uri);                Log.i("-----拍照url",path);                list.add(path);                Bitmap image = createThumb(path);                //Bitmap bitmap = BitmapFactory.decodeFile(path);                Collections.reverse(gridViewBitmap);                gridViewBitmap.add(image);                Collections.reverse(gridViewBitmap);                adapter.notifyDataSetChanged();            }        }    }    //上传头像    public void postFile(ArrayList<String>  list) throws Exception{//        File file = new File(path);        if (list!=null&&list.size()>0){            com.loopj.android.http.RequestParams params=new com.loopj.android.http.RequestParams();            AsyncHttpClient client= new AsyncHttpClient();            client.addHeader("ticket", "08DDB06A0457505B0BE6013C6D353197");            client.addHeader("ContentType", "multipart/form-data") ;            for (int i=0;i<list.size();i++){                File file=new File(list.get(i));                params.put("file"+i, file);            }            Log.i("-----list.size()------",list.size()+"");            params.put("type", "MALL");            params.put("where", "FOCUS");            client.post("http://hgj.doolii.cn/merchant/res/image/upload", params, new AsyncHttpResponseHandler(){                @Override                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {                    if (statusCode==200) {                        Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_LONG).show();                        Log.i("---AsyncHttpClient---",new String(responseBody));//                        ACache aCache=ACache.get(UserActivity.this);//清除缓存//                        aCache.remove("accountInfo");//                app.getAccount().setImgUrl(path);//                        my_headPicture.setImageBitmap(BitmapUtils.UrlToBitmap(path));                    }                }                @Override                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {                    Toast.makeText(MainActivity.this, "上传失败", Toast.LENGTH_LONG).show();                }            });        }else        {            Toast.makeText(MainActivity.this, "没有选择图片,不可上传", Toast.LENGTH_LONG).show();        }    }    /**     * 获取文件绝对路径     *     * @param uri     * @return     */    public String getPath(Uri uri) {        if ("content".equalsIgnoreCase(uri.getScheme())) {            Cursor cursor = null;            try {                cursor = this.getContentResolver().query(uri, null, null, null, null);                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);                if (cursor.moveToFirst()) {                    return cursor.getString(column_index);                }            } catch (Exception e) {                cursor.close();            }            cursor.close();        } else if ("file".equalsIgnoreCase(uri.getScheme())) {            return uri.getPath();        }        return null;    }    public Bitmap createThumb(String path) {        Bitmap bitmap = BitmapFactory.decodeFile(path);        //利用Bitmap位图对象生成缩略图        int height = (int) (getScreenDensity(this) * 60);        int width = (int) (getScreenDensity(this) * 100);        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height);        return bitmap;    }    /**     * 获取屏幕密度     *     * @param context     * @return     */    public static float getScreenDensity(Context context) {        return getMetricsFacade(context).density;    }    /**     * 获取屏幕对象     *     * @param context     * @return     */    private static DisplayMetrics getMetricsFacade(Context context) {        WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        Display display = manager.getDefaultDisplay();        DisplayMetrics dm = new DisplayMetrics();        display.getMetrics(dm);        return dm;    }    /**     * 显示默认的图片选择器     */    public void showAlbums() {        Intent intent = new Intent(Intent.ACTION_PICK);        intent.setType("image/*");        startActivityForResult(intent, 3000);    }    /**     * 调用系统自带的相机 并且保存到固定的文件里     */    public void showCamera() {        Intent takephoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        takephoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mCurrentFilePath));        startActivityForResult(takephoto, CAMERA_SELECT_CODE);    }    // 设置上传头像    private void showPopupWindow(View parent) {        if (popWindow == null) {            View view = layoutInflater.inflate(R.layout.pop_select_photo, null);// 相机/相册/取消选择界面            popWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT,                    ViewGroup.LayoutParams.MATCH_PARENT, true);            initPop(view);// 初始化popwindow参数        }        popWindow.setAnimationStyle(android.R.style.Animation_InputMethod);        popWindow.setFocusable(true);        popWindow.setOutsideTouchable(true);        popWindow.setBackgroundDrawable(new BitmapDrawable());        popWindow                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);        popWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);    } // 初始化popwindow参数    public void initPop(View view) {        photograph = (TextView) view.findViewById(R.id.photograph);// 拍照        albums = (TextView) view.findViewById(R.id.albums);// 相册        cancel = (LinearLayout) view.findViewById(R.id.cancel);// 取消        // 相机拍照监听        photograph.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                showAlbums();            }        });        // 相册获取监听        albums.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                popWindow.dismiss();                showCamera();            }        });        // 取消监听        cancel.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                popWindow.dismiss();            }        });    }    //为图片创建不同的名字    public static String createFileName() {        String fileName = "";        //系统当前时间        Date date = new Date(System.currentTimeMillis());        SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");        fileName = dateFormat.format(date) + ".jpg";        return fileName;    }}layout文件如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context=".MainActivity"    tools:showIn="@layout/activity_main"><Button    android:id="@+id/upload"    android:layout_width="match_parent"    android:layout_height="wrap_content" />    <GridView        android:id="@+id/gridview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:numColumns="4"        android:scrollbars="none" /></LinearLayout>
pop_choose_pic布局文件如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout    android:background="@color/popcolor"    android:layout_width="fill_parent"    android:orientation="vertical"    android:layout_height="fill_parent"    android:gravity="center"    xmlns:android="http://schemas.android.com/apk/res/android">    <TextView        android:textSize="16sp"        android:textColor="#fff"        android:gravity="center"        android:id="@+id/photo"        android:background="@drawable/btn_press"        android:padding="10dp"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="20dp"        android:layout_marginRight="20dp"        android:text="photo"        android:layout_centerInParent="true" />    <TextView        android:textSize="16sp"        android:textColor="#fff"        android:gravity="center"        android:id="@+id/gallery"        android:background="@drawable/btn_press"        android:padding="10dp"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="20dp"        android:layout_marginTop="30dp"        android:layout_marginRight="20dp"        android:text="gallery" />    <TextView        android:textSize="16sp"        android:textColor="#fff"        android:gravity="center"        android:id="@+id/cancel"        android:background="@drawable/btn_press"        android:padding="10dp"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="20dp"        android:layout_marginTop="30dp"        android:layout_marginRight="20dp"        android:text="cancle" /></LinearLayout>
gridviewitem代码如下:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="match_parent">    <ImageView        android:id="@+id/gridview_image"        android:layout_width="100dp"        android:layout_height="100dp" />    <ImageView        android:id="@+id/gridview_dele"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignRight="@id/gridview_image"        android:layout_alignTop="@id/gridview_image"        android:padding="10dp"        android:src="@mipmap/dele"        android:visibility="gone" /></RelativeLayout>


更多相关文章

  1. Cordova 3.x 基础(13) -- 为Android(安卓)APK签名
  2. 基于Android(安卓)Studio 的NDK之 “Hello,World!”
  3. Android学习笔记(三) 之模拟打电话
  4. Android(安卓)HIDL 中 hidl-gen使用
  5. android实现瀑布流加载图片
  6. ECLIPSE android 布局页面文件出错故障排除Exception raised dur
  7. Android(安卓)Studio上报错java.net.UnknownServiceException: C
  8. Android图片加载之认识bitmap的四种加载方式
  9. Error generating final archive: java.io.EOFException

随机推荐

  1. android下安装AnDroidDraw
  2. Android的自定义长按
  3. Android中Intent传值
  4. android之OkHttpClient通信
  5. Android中消息机制中一些细节知识点
  6. android中使用SQLite进行CRUD操作的实例
  7. android Environment 常用方法(获取存储目
  8. android 电子签名 手写签名 功能实现
  9. android 图片的浏览、缩放、拖动和自动居
  10. 国内一些优秀Android 开发者信息