Android实现图片选择上传功能实例

效果图:

添加依赖:

选择图片:compile 'com.lzy.widget:imagepicker:0.5.4'

github地址:https://github.com/jeasonlzy/ImagePicker

上传文件:compile 'com.zhy:okhttputils:2.6.2'

github地址:https://github.com/hongyangAndroid/okhttputils

MainActivity.java

package com.yechaoa.uploadimage;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.AdapterView;
import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.bean.ImageItem;
import com.lzy.imagepicker.ui.ImageGridActivity;
import com.lzy.imagepicker.ui.ImagePreviewDelActivity;
import com.lzy.imagepicker.view.CropImageView;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Call;
public class MainActivity extends AppCompatActivity implements ImagePickerAdapter.OnRecyclerViewItemClickListener{
  public static final int IMAGE_ITEM_ADD = -1;
  public static final int REQUEST_CODE_SELECT = 100;
  public static final int REQUEST_CODE_PREVIEW = 101;
  private ImagePickerAdapter adapter;
  private ArrayList<ImageItem> selImageList; //当前选择的所有图片
  private int maxImgCount = 8;        //允许选择图片最大数
  private HttpUtil httpUtil;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    httpUtil = new HttpUtil();
    findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        uploadImage(selImageList);
      }
    });
    //最好放到 Application oncreate执行
    initImagePicker();
    initWidget();
  }
  private void initImagePicker() {
    ImagePicker imagePicker = ImagePicker.getInstance();
    imagePicker.setImageLoader(new GlideImageLoader());  //设置图片加载器
    imagePicker.setShowCamera(true);           //显示拍照按钮
    imagePicker.setCrop(true);              //允许裁剪(单选才有效)
    imagePicker.setSaveRectangle(true);          //是否按矩形区域保存
    imagePicker.setSelectLimit(maxImgCount);       //选中数量限制
    imagePicker.setMultiMode(false);           //多选
    imagePicker.setStyle(CropImageView.Style.RECTANGLE); //裁剪框的形状
    imagePicker.setFocusWidth(800);            //裁剪框的宽度。单位像素(圆形自动取宽高最小值)
    imagePicker.setFocusHeight(800);           //裁剪框的高度。单位像素(圆形自动取宽高最小值)
    imagePicker.setOutPutX(1000);             //保存文件的宽度。单位像素
    imagePicker.setOutPutY(1000);             //保存文件的高度。单位像素
  }
  private void initWidget() {
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    selImageList = new ArrayList<>();
    adapter = new ImagePickerAdapter(this, selImageList, maxImgCount);
    adapter.setOnItemClickListener(this); 

    recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(adapter);
  } 

  private SelectDialog showDialog(SelectDialog.SelectDialogListener listener, List<String> names) {
    SelectDialog dialog = new SelectDialog(this, R.style.transparentFrameWindowStyle, listener, names);
    if (!this.isFinishing()) {
      dialog.show();
    }
    return dialog;
  }
  @Override
  public void onItemClick(View view, int position) {
    switch (position) {
      case IMAGE_ITEM_ADD:
        List<String> names = new ArrayList<>();
        names.add("拍照");
        names.add("相册");
        showDialog(new SelectDialog.SelectDialogListener() {
          @Override
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
              case 0: // 直接调起相机
                //打开选择,本次允许选择的数量
                ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size());
                Intent intent = new Intent(MainActivity.this, ImageGridActivity.class);
                intent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS,true); // 是否是直接打开相机
                startActivityForResult(intent, REQUEST_CODE_SELECT);
                break;
              case 1:
                //打开选择,本次允许选择的数量
                ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size());
                Intent intent1 = new Intent(MainActivity.this, ImageGridActivity.class);
                startActivityForResult(intent1, REQUEST_CODE_SELECT);
                break;
              default:
                break;
            }
          }
        }, names);
        break;
      default:
        //打开预览
        Intent intentPreview = new Intent(this, ImagePreviewDelActivity.class);
        intentPreview.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS, (ArrayList<ImageItem>) adapter.getImages());
        intentPreview.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION, position);
        intentPreview.putExtra(ImagePicker.EXTRA_FROM_ITEMS,true);
        startActivityForResult(intentPreview, REQUEST_CODE_PREVIEW);
        break;
    }
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == ImagePicker.RESULT_CODE_ITEMS) {
      //添加图片返回
      if (data != null && requestCode == REQUEST_CODE_SELECT) {
        ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS);
        if (images != null){
          selImageList.addAll(images);
          adapter.setImages(selImageList);
        }
      }
    } else if (resultCode == ImagePicker.RESULT_CODE_BACK) {
      //预览图片返回
      if (data != null && requestCode == REQUEST_CODE_PREVIEW) {
        ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_IMAGE_ITEMS);
        if (images != null){
          selImageList.clear();
          selImageList.addAll(images);
          adapter.setImages(selImageList);
        }
      }
    }
  }
  private String url="http..."; 

  private void uploadImage(ArrayList<ImageItem> pathList) {
    httpUtil.postFileRequest(url, null, pathList, new MyStringCallBack() { 

      @Override
      public void onError(Call call, Exception e, int id) {
        super.onError(call, e, id);
      }
      @Override
      public void onResponse(String response, int id) {
        super.onResponse(response, id);
        //返回图片的地址
      }
    });
  }
}

Demo地址:https://github.com/yechaoa/UploadImage

以上就是全部内容,包含了代码,大家还有任何其他疑问可以在下方的留言讨论,感谢你对我们的支持。

您可能感兴趣的文章:

  • android实现上传本地图片到网络功能
  • Android中使用GridView实现仿微信图片上传功能(附源代码)
  • android递归压缩上传多张图片到七牛的实例代码
  • Android上传多张图片的实例代码(RxJava异步分发)
  • 浅析Android 快速实现图片压缩与上传功能
  • Android将图片上传到php服务器的实例代码
  • Android使用OkHttp上传图片的实例代码
  • Android OkHttp 结合php 多图片上传实例
(0)

相关推荐

  • android实现上传本地图片到网络功能

    本文实例为大家分享了android上传本地图片到网络的具体代码,供大家参考,具体内容如下 首先这里用到了Okhttp 所以需要一个依赖: compile 'com.squareup.okhttp3:okhttp:3.9.0' xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res

  • Android使用OkHttp上传图片的实例代码

    简介 上传图片是一个APP的常见功能,可以是通过OOS上传到阿里云,也可以直接上传到Server后台,OOS有提供相应的SDK,此处忽略.下面通过OkHttp来实现图片的上传 代码 直接上代码UploadFileHelper.kt object UploadFileHelper { //--------ContentType private val MEDIA_OBJECT_STREAM = MediaType.parse("multipart/form-data") //------

  • 浅析Android 快速实现图片压缩与上传功能

    由于最近项目更新功能比较的忙,也没时间去整理自己的知识点和管理自己的博客.在Android对手机相册中的图片的压缩和上传到服务器上,这样的功能在每个app开发中都会有这样的需求.所以今天就对android端怎么快速实现图片压缩和上传进行简单的分析. 首先需要对图片进行压缩,这方面可以使用第三方的库,我在实际的开发中使用的是 compile 'top.zibin:Luban:1.0.9'使用也比较的方便,代码如下: /** * * @param path 代表的是图片的uri路径 */ priva

  • Android OkHttp 结合php 多图片上传实例

    今天写项目的时候需要多图片上传,就用okhttp简单写一个例子. public class MainActivity extends AppCompatActivity { private OkHttpClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ma

  • Android中使用GridView实现仿微信图片上传功能(附源代码)

    由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下面的图片就是点击"加号"后弹出的对话框,通过对话框可以根据自己需求进行相片选择. 项目结构: 下面直接上代码. 整体的布局文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/

  • android递归压缩上传多张图片到七牛的实例代码

    最近遇到这样一个需求:要做一个仿微信朋友圈的功能,要求上传最多九张图到七牛.七牛有上传图片的接口,但是每次只能上传一张.如果是九张图片一齐上传,使用for循环的话肯定不行的,很容易出错.因为上传七牛的动作是在子线程完成的,for循环是在主线程的,这就相当于同时开启十个子线程来上传图片,而且都是耗时线程,很容易会ANR的. 最好的解决办法应该是先压缩图片,在200k-300k之间,保证图片不失真,然后一张一张上传,通过七牛的回调,来判断上一张图片是否上传完成,上传完成了,再上传下一张图片. 好了,

  • Android上传多张图片的实例代码(RxJava异步分发)

    学习RxJava有一段时间了,一直在考虑怎么使用,如何在项目中合理运用它.在android很多项目中,都会存在图片上传,下面我介绍如何用Rxjava异步上传多张图片. 一,用到的框架 compile 'top.zibin:Luban:1.0.9'//图片压缩 compile 'org.xutils:xutils:3.3.34'//网络请求 compile 'io.reactivex:rxandroid:1.1.0'//rxandroid compile 'io.reactivex:rxjava:

  • Android将图片上传到php服务器的实例代码

    layout中很普通,就是两个button和一个ImageView <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&q

  • Android实现图片选择上传功能实例

    效果图: 添加依赖: 选择图片:compile 'com.lzy.widget:imagepicker:0.5.4' github地址:https://github.com/jeasonlzy/ImagePicker 上传文件:compile 'com.zhy:okhttputils:2.6.2' github地址:https://github.com/hongyangAndroid/okhttputils MainActivity.java package com.yechaoa.upload

  • php+ajax实现图片文件上传功能实例

    目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效果,以及flash+php功能,下面介绍ajax与iframe实现异步文件上传的功能的例子. 方法一,利用jquery ajaxfileupload.js实现文件上传 其实就是实现无刷新式的文件上传.可采用IFRAME文件上传原理.实际上在用PHP上传文件时...只能用$_FILES形式,但是若我们只是单一的用JS方式取其ID,如<input id='img' type='file'>..document.g

  • Android 拍照选择图片并上传功能的实现思路(包含权限动态获取)

    作为一个Android新手,想实现手机拍照并上传的功能,经过查找资料,已实现此功能.在此记录备忘.老鸟请忽略. 一.实现思路: 1.Android手机客户端,拍照(或选择图片),然后上传到服务器. 2.服务器端接收手机端上传上来的图片. 二.实现步骤: 1.按惯例,先放效果图: 项目结构: 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a

  • webuploader 实现图片批量上传功能附实例代码

    1.导入资源 2.JSP代码 <div class="page-container"> <div class="row cl"> <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>项目名称:</label> <div class="formCont

  • Struts2实现文件上传功能实例解析

    一. 搭建struts2环境 在myeclipse下,右击项目->MyEclipse->Project Facets->install Apache Struts2. 如要自己搭建,需下载struts2包,写struts.xml配置文件. web.xml文件配置如下: <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher

  • Java与WebUploader相结合实现文件上传功能(实例代码)

    之前自己写小项目的时候也碰到过文件上传的问题,没有找到很好的解决方案.虽然之前网找各种解决方案的时候也看到过WebUploader,但没有进一步深究.这次稍微深入了解了些,这里也做个小结. 简单的文件和普通数据上传并保存 jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE h

  • 可兼容php5与php7的cURL文件上传功能实例分析

    本文实例讲述了可兼容php5与php7的cURL文件上传功能.分享给大家供大家参考,具体如下: 为啥要写这个示例 最近修改一个项目,需要通过cURL上传文件. 记得之前做过类似实现的,于是翻出来之前的代码,使用的是"@"前缀方式. 但同样的方法现在不行了!后来发现,是版本兼容问题. 奔着开源分享的精神,同时避免自己遗忘,于是写了下面的示例程序. 示例程序 特别说明: 共3个文件,都放在web根目录的test目录下,同时保证该目录可写.上传的图片也会保存在该目录. 如果要将程序文件放在其

  • Bootstrap+PHP实现多图上传功能实例详解

    使用bootstrap界面美观,可预览,可拖拽上传,可配合ajax异步或同步上传,下面是效果图: 前端代码:fileinput.html <!DOCTYPE html> <!-- release v4.1.8, copyright 2014 - 2015 Kartik Visweswaran --> <html lang="en"> <head> <meta charset="UTF-8"/> <ti

  • thinkPHP5框架整合plupload实现图片批量上传功能的方法

    本文实例讲述了thinkPHP5框架整合plupload实现图片批量上传功能的方法.分享给大家供大家参考,具体如下: 在官网下载plupload http://http//www.plupload.com 或者点击此处本站下载. 这里我们使用的是pluploadQueue 在HTML页面引入相应的css和js,然后根据示例代码修改为自己的代码 <link rel="stylesheet" href="/assets/plupupload/css/jquery.plupl

  • PHP实现文件上传功能实例代码

    点击浏览,将所选的文件上传到创建的images文件夹内 代码如下: 1.wenjian.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

随机推荐