Android选择图片或拍照图片上传到服务器

Android选择图片或拍照图片上传到服务器,第1张

概述最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了! 不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的

最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI

具体上传代码:

1.选择图片和上传界面,包括上传完成和异常的回调监听

package com.spring.sky.image.upload;   import java.util.HashMap; import java.util.Map;  import androID.app.Activity; import androID.app.ProgressDialog; import androID.content.Intent; import androID.graphics.Bitmap; import androID.graphics.BitmapFactory; import androID.os.Bundle; import androID.os.Handler; import androID.os.Message; import androID.util.Log; import androID.vIEw.VIEw; import androID.vIEw.VIEw.OnClickListener; import androID.Widget.button; import androID.Widget.ImageVIEw; import androID.Widget.Progressbar; import androID.Widget.TextVIEw; import androID.Widget.Toast;  import com.spring.sky.image.upload.network.UploadUtil; import com.spring.sky.image.upload.network.UploadUtil.OnUploadProcessListener; /**  * @author spring sky<br>  * Email :vipa1888@163.com<br>  * QQ: 840950105<br>  * 说明:主要用于选择文件和上传文件 *** 作  */ public class MainActivity extends Activity implements OnClickListener,OnUploadProcessListener{  private static final String TAG = "uploadImage";    /**   * 去上传文件   */  protected static final int TO_UPLOAD_file = 1;  /**   * 上传文件响应   */  protected static final int UPLOAD_file_DONE = 2; //  /**   * 选择文件   */  public static final int TO_SELECT_PHOTO = 3;  /**   * 上传初始化   */  private static final int UPLOAD_INIT_PROCESS = 4;  /**   * 上传中   */  private static final int UPLOAD_IN_PROCESS = 5;  /***   * 这里的这个URL是我服务器的javaEE环境URL   */  private static String requestURL = "http://192.168.10.160:8080/fileUpload/p/file!upload";  private button selectbutton,uploadbutton;  private ImageVIEw imageVIEw;  private TextVIEw uploadImageResult;  private Progressbar progressbar;    private String picPath = null;  private ProgressDialog progressDialog;    /** Called when the activity is first created. */  @OverrIDe  public voID onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentVIEw(R.layout.main);   initVIEw();  }    /**   * 初始化数据   */  private voID initVIEw() {   selectbutton = (button) this.findVIEwByID(R.ID.selectimage);   uploadbutton = (button) this.findVIEwByID(R.ID.uploadImage);   selectbutton.setonClickListener(this);   uploadbutton.setonClickListener(this);   imageVIEw = (ImageVIEw) this.findVIEwByID(R.ID.imageVIEw);   uploadImageResult = (TextVIEw) findVIEwByID(R.ID.uploadImageResult);   progressDialog = new ProgressDialog(this);   progressbar = (Progressbar) findVIEwByID(R.ID.progressbar1);  }   @OverrIDe  public voID onClick(VIEw v) {   switch (v.getID()) {   case R.ID.selectimage:    Intent intent = new Intent(this,SelectPicActivity.class);    startActivityForResult(intent,TO_SELECT_PHOTO);    break;   case R.ID.uploadImage:    if(picPath!=null)    {     handler.sendEmptyMessage(TO_UPLOAD_file);    }else{     Toast.makeText(this,"上传的文件路径出错",Toast.LENGTH_LONG).show();    }    break;   default:    break;   }  }   @OverrIDe  protected voID onActivityResult(int requestCode,int resultCode,Intent data) {   if(resultCode==Activity.RESulT_OK && requestCode == TO_SELECT_PHOTO)   {    picPath = data.getStringExtra(SelectPicActivity.KEY_PHOTO_PATH);    Log.i(TAG,"最终选择的图片="+picPath);    Bitmap bm = BitmapFactory.decodefile(picPath);    imageVIEw.setimageBitmap(bm);   }   super.onActivityResult(requestCode,resultCode,data);  }     /**   * 上传服务器响应回调   */  @OverrIDe  public voID onUploadDone(int responseCode,String message) {   progressDialog.dismiss();   Message msg = Message.obtain();   msg.what = UPLOAD_file_DONE;   msg.arg1 = responseCode;   msg.obj = message;   handler.sendMessage(msg);  }    private voID toUploadfile()  {   uploadImageResult.setText("正在上传中...");   progressDialog.setMessage("正在上传文件...");   progressDialog.show();   String fileKey = "pic";   UploadUtil uploadUtil = UploadUtil.getInstance();;   uploadUtil.setonUploadProcessListener(this); //设置监听器监听上传状态      Map<String,String> params = new HashMap<String,String>();   params.put("orderID","11111");   uploadUtil.uploadfile( picPath,fileKey,requestURL,params);  }    private Handler handler = new Handler(){   @OverrIDe   public voID handleMessage(Message msg) {    switch (msg.what) {    case TO_UPLOAD_file:     toUploadfile();     break;        case UPLOAD_INIT_PROCESS:     progressbar.setMax(msg.arg1);     break;    case UPLOAD_IN_PROCESS:     progressbar.setProgress(msg.arg1);     break;    case UPLOAD_file_DONE:     String result = "响应码:"+msg.arg1+"\n响应信息:"+msg.obj+"\n耗时:"+UploadUtil.getRequestTime()+"秒";     uploadImageResult.setText(result);     break;    default:     break;    }    super.handleMessage(msg);   }     };   @OverrIDe  public voID onUploadProcess(int uploadSize) {   Message msg = Message.obtain();   msg.what = UPLOAD_IN_PROCESS;   msg.arg1 = uploadSize;   handler.sendMessage(msg );  }   @OverrIDe  public voID initUpload(int fileSize) {   Message msg = Message.obtain();   msg.what = UPLOAD_INIT_PROCESS;   msg.arg1 = fileSize;   handler.sendMessage(msg );  }   } 

2.选择图片界面,主要涉及两种方式:选择图片和及时拍照图片

package com.spring.sky.image.upload;  import androID.app.Activity; import androID.content.ContentValues; import androID.content.Intent; import androID.database.Cursor; import androID.net.Uri; import androID.os.Bundle; import androID.os.Environment; import androID.provIDer.MediaStore; import androID.util.Log; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw; import androID.vIEw.VIEw.OnClickListener; import androID.Widget.button; import androID.Widget.linearLayout; import androID.Widget.Toast;  /**  * @author spring sky<br>  * Email :vipa1888@163.com<br>  * QQ: 840950105<br>  * @version 创建时间:2012-11-22 上午9:20:03  * 说明:主要用于选择文件 *** 作  */  public class SelectPicActivity extends Activity implements OnClickListener{   /***   * 使用照相机拍照获取图片   */  public static final int SELECT_PIC_BY_TACK_PHOTO = 1;  /***   * 使用相册中的图片   */  public static final int SELECT_PIC_BY_PICK_PHOTO = 2;    /***   * 从Intent获取图片路径的KEY   */  public static final String KEY_PHOTO_PATH = "photo_path";    private static final String TAG = "SelectPicActivity";    private linearLayout dialogLayout;  private button takePhotoBtn,pickPhotoBtn,cancelBtn;   /**获取到的图片路径*/  private String picPath;    private Intent lastIntent ;    private Uri photoUri;  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentVIEw(R.layout.select_pic_layout);   initVIEw();  }  /**   * 初始化加载VIEw   */  private voID initVIEw() {   dialogLayout = (linearLayout) findVIEwByID(R.ID.dialog_layout);   dialogLayout.setonClickListener(this);   takePhotoBtn = (button) findVIEwByID(R.ID.btn_take_photo);   takePhotoBtn.setonClickListener(this);   pickPhotoBtn = (button) findVIEwByID(R.ID.btn_pick_photo);   pickPhotoBtn.setonClickListener(this);   cancelBtn = (button) findVIEwByID(R.ID.btn_cancel);   cancelBtn.setonClickListener(this);      lastIntent = getIntent();  }   @OverrIDe  public voID onClick(VIEw v) {   switch (v.getID()) {   case R.ID.dialog_layout:    finish();    break;   case R.ID.btn_take_photo:    takePhoto();    break;   case R.ID.btn_pick_photo:    pickPhoto();    break;   default:    finish();    break;   }  }   /**   * 拍照获取图片   */  private voID takePhoto() {   //执行拍照前,应该先判断SD卡是否存在   String SDState = Environment.getExternalStorageState();   if(SDState.equals(Environment.MEDIA_MOUNTED))   {        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//"androID.media.action.IMAGE_CAPTURE"    /***     * 需要说明一下,以下 *** 作使用照相机拍照,拍照后的图片会存放在相册中的     * 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图     * 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰     */    ContentValues values = new ContentValues();    photoUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);    intent.putExtra(androID.provIDer.MediaStore.EXTRA_OUTPUT,photoUri);    /**-----------------*/    startActivityForResult(intent,SELECT_PIC_BY_TACK_PHOTO);   }else{    Toast.makeText(this,"内存卡不存在",Toast.LENGTH_LONG).show();   }  }   /***   * 从相册中取图片   */  private voID pickPhoto() {   Intent intent = new Intent();   intent.setType("image/*");   intent.setAction(Intent.ACTION_GET_CONTENT);   startActivityForResult(intent,SELECT_PIC_BY_PICK_PHOTO);  }    @OverrIDe  public boolean ontouchEvent(MotionEvent event) {   finish();   return super.ontouchEvent(event);  }      @OverrIDe  protected voID onActivityResult(int requestCode,Intent data) {   if(resultCode == Activity.RESulT_OK)   {    doPhoto(requestCode,data);   }   super.onActivityResult(requestCode,data);  }    /**   * 选择图片后,获取图片的路径   * @param requestCode   * @param data   */  private voID doPhoto(int requestCode,Intent data)  {   if(requestCode == SELECT_PIC_BY_PICK_PHOTO ) //从相册取图片,有些手机有异常情况,请注意   {    if(data == null)    {     Toast.makeText(this,"选择图片文件出错",Toast.LENGTH_LONG).show();     return;    }    photoUri = data.getData();    if(photoUri == null )    {     Toast.makeText(this,Toast.LENGTH_LONG).show();     return;    }   }   String[] pojo = {MediaStore.Images.Media.DATA};   Cursor cursor = managedquery(photoUri,pojo,null,null);    if(cursor != null )   {    int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);    cursor.movetoFirst();    picPath = cursor.getString(columnIndex);    cursor.close();   }   Log.i(TAG,"imagePath = "+picPath);   if(picPath != null && ( picPath.endsWith(".png") || picPath.endsWith(".PNG") ||picPath.endsWith(".jpg") ||picPath.endsWith(".JPG") ))   {    lastIntent.putExtra(KEY_PHOTO_PATH,picPath);    setResult(Activity.RESulT_OK,lastIntent);    finish();   }else{    Toast.makeText(this,"选择图片文件不正确",Toast.LENGTH_LONG).show();   }  } } 

3. 上传工具类,主要实现了图片的上传,上传过程的初始化监听和上传完成的监听,还有上传耗时的计算

package com.spring.sky.image.upload.network;  import java.io.DataOutputStream; import java.io.file; import java.io.fileinputStream; import java.io.IOException; import java.io.inputStream; import java.net.httpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.UUID;  import androID.util.Log;  /**  *  * 上传工具类  * @author spring sky<br>  * Email :vipa1888@163.com<br>  * QQ: 840950105<br>  * 支持上传文件和参数  */ public class UploadUtil {  private static UploadUtil uploadUtil;  private static final String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成  private static final String PREFIX = "--";  private static final String liNE_END = "\r\n";  private static final String CONTENT_TYPE = "multipart/form-data"; // 内容类型  private UploadUtil() {   }   /**   * 单例模式获取上传工具类   * @return   */  public static UploadUtil getInstance() {   if (null == uploadUtil) {    uploadUtil = new UploadUtil();   }   return uploadUtil;  }   private static final String TAG = "UploadUtil";  private int readTimeOut = 10 * 1000; // 读取超时  private int connectTimeout = 10 * 1000; // 超时时间  /***   * 请求使用多长时间   */  private static int requestTime = 0;    private static final String CHARSET = "utf-8"; // 设置编码   /***   * 上传成功   */  public static final int UPLOAD_SUCCESS_CODE = 1;  /**   * 文件不存在   */  public static final int UPLOAD_file_NOT_EXISTS_CODE = 2;  /**   * 服务器出错   */  public static final int UPLOAD_SERVER_ERROR_CODE = 3;  protected static final int WHAT_TO_UPLOAD = 1;  protected static final int WHAT_UPLOAD_DONE = 2;    /**   * androID上传文件到服务器   *   * @param filePath   *   需要上传的文件的路径   * @param fileKey   *   在网页上<input type=file name=xxx/> xxx就是这里的fileKey   * @param RequestURL   *   请求的URL   */  public voID uploadfile(String filePath,String fileKey,String RequestURL,Map<String,String> param) {   if (filePath == null) {    sendMessage(UPLOAD_file_NOT_EXISTS_CODE,"文件不存在");    return;   }   try {    file file = new file(filePath);    uploadfile(file,RequestURL,param);   } catch (Exception e) {    sendMessage(UPLOAD_file_NOT_EXISTS_CODE,"文件不存在");    e.printstacktrace();    return;   }  }   /**   * androID上传文件到服务器   *   * @param file   *   需要上传的文件   * @param fileKey   *   在网页上<input type=file name=xxx/> xxx就是这里的fileKey   * @param RequestURL   *   请求的URL   */  public voID uploadfile(final file file,final String fileKey,final String RequestURL,final Map<String,String> param) {   if (file == null || (!file.exists())) {    sendMessage(UPLOAD_file_NOT_EXISTS_CODE,"文件不存在");    return;   }    Log.i(TAG,"请求的URL=" + RequestURL);   Log.i(TAG,"请求的filename=" + file.getname());   Log.i(TAG,"请求的fileKey=" + fileKey);   new Thread(new Runnable() { //开启线程上传文件    @OverrIDe    public voID run() {     toUploadfile(file,param);    }   }).start();     }   private voID toUploadfile(file file,String> param) {   String result = null;   requestTime= 0;      long requestTime = System.currentTimeMillis();   long responseTime = 0;    try {    URL url = new URL(RequestURL);    httpURLConnection conn = (httpURLConnection) url.openConnection();    conn.setReadTimeout(readTimeOut);    conn.setConnectTimeout(connectTimeout);    conn.setDoinput(true); // 允许输入流    conn.setDoOutput(true); // 允许输出流    conn.setUseCaches(false); // 不允许使用缓存    conn.setRequestMethod("POST"); // 请求方式    conn.setRequestProperty("Charset",CHARSET); // 设置编码    conn.setRequestProperty("connection","keep-alive");    conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; windows NT 5.1; SV1)");    conn.setRequestProperty("Content-Type",CONTENT_TYPE + ";boundary=" + BOUNDARY); //   conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");        /**     * 当文件不为空,把文件包装并且上传     */    DataOutputStream dos = new DataOutputStream(conn.getoutputStream());    StringBuffer sb = null;    String params = "";        /***     * 以下是用于上传参数     */    if (param != null && param.size() > 0) {     Iterator<String> it = param.keySet().iterator();     while (it.hasNext()) {      sb = null;      sb = new StringBuffer();      String key = it.next();      String value = param.get(key);      sb.append(PREFIX).append(BOUNDARY).append(liNE_END);      sb.append("Content-disposition: form-data; name=\"").append(key).append("\"").append(liNE_END).append(liNE_END);      sb.append(value).append(liNE_END);      params = sb.toString();      Log.i(TAG,key+"="+params+"##");      dos.write(params.getBytes()); //     dos.flush();     }    }        sb = null;    params = null;    sb = new StringBuffer();    /**     * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件     * filename是文件的名字,包含后缀名的 比如:abc.png     */    sb.append(PREFIX).append(BOUNDARY).append(liNE_END);    sb.append("Content-disposition:form-data; name=\"" + fileKey      + "\"; filename=\"" + file.getname() + "\"" + liNE_END);    sb.append("Content-Type:image/pjpeg" + liNE_END); // 这里配置的Content-type很重要的 ,用于服务器端辨别文件的类型的    sb.append(liNE_END);    params = sb.toString();    sb = null;        Log.i(TAG,file.getname()+"=" + params+"##");    dos.write(params.getBytes());    /**上传文件*/    inputStream is = new fileinputStream(file);    onUploadProcessListener.initUpload((int)file.length());    byte[] bytes = new byte[1024];    int len = 0;    int curLen = 0;    while ((len = is.read(bytes)) != -1) {     curLen += len;     dos.write(bytes,len);     onUploadProcessListener.onUploadProcess(curLen);    }    is.close();        dos.write(liNE_END.getBytes());    byte[] end_data = (PREFIX + BOUNDARY + PREFIX + liNE_END).getBytes();    dos.write(end_data);    dos.flush(); //   //   dos.write(tempOutputStream.toByteArray());    /**     * 获取响应码 200=成功 当响应成功,获取响应的流     */    int res = conn.getResponseCode();    responseTime = System.currentTimeMillis();    this.requestTime = (int) ((responseTime-requestTime)/1000);    Log.e(TAG,"response code:" + res);    if (res == 200) {     Log.e(TAG,"request success");     inputStream input = conn.getinputStream();     StringBuffer sb1 = new StringBuffer();     int ss;     while ((ss = input.read()) != -1) {      sb1.append((char) ss);     }     result = sb1.toString();     Log.e(TAG,"result : " + result);     sendMessage(UPLOAD_SUCCESS_CODE,"上传结果:"       + result);     return;    } else {     Log.e(TAG,"request error");     sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:code=" + res);     return;    }   } catch (MalformedURLException e) {    sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());    e.printstacktrace();    return;   } catch (IOException e) {    sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());    e.printstacktrace();    return;   }  }   /**   * 发送上传结果   * @param responseCode   * @param responseMessage   */  private voID sendMessage(int responseCode,String responseMessage)  {   onUploadProcessListener.onUploadDone(responseCode,responseMessage);  }    /**   * 下面是一个自定义的回调函数,用到回调上传文件是否完成   *   * @author shimingzheng   *   */  public static interface OnUploadProcessListener {   /**    * 上传响应    * @param responseCode    * @param message    */   voID onUploadDone(int responseCode,String message);   /**    * 上传中    * @param uploadSize    */   voID onUploadProcess(int uploadSize);   /**    * 准备上传    * @param fileSize    */   voID initUpload(int fileSize);  }  private OnUploadProcessListener onUploadProcessListener;       public voID setonUploadProcessListener(    OnUploadProcessListener onUploadProcessListener) {   this.onUploadProcessListener = onUploadProcessListener;  }   public int getReadTimeOut() {   return readTimeOut;  }   public voID setReadTimeOut(int readTimeOut) {   this.readTimeOut = readTimeOut;  }   public int getConnectTimeout() {   return connectTimeout;  }   public voID setConnectTimeout(int connectTimeout) {   this.connectTimeout = connectTimeout;  }  /**   * 获取上传使用的时间   * @return   */  public static int getRequestTime() {   return requestTime;  }    public static interface uploadProcessListener{     }         } 

以上代码,我就不详细讲解原理,相关难点注释已经写得很清楚了!分享出来,和大家一起学习!

相关服务器端代码和客户端下载:
android客户端下载
javaEE服务器端

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android选择图片或拍照图片上传到服务器全部内容,希望文章能够帮你解决Android选择图片或拍照图片上传到服务器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1141796.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存