android调用照相机拍照获取照片并做简单剪裁

引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html

 

效果:

 

 

 

 

 

客服端代码:

 
  1. package com.cn.lxz.zhaopian;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Date;  
  7. import java.util.HashMap;  
  8. import java.util.Map;  
  9.   
  10. import lxz.utils.android.graphics.GraphicsBitmapUtils;  
  11. import lxz.utils.android.net.UploadFile;  
  12. import lxz.utils.android.resource.AndroidClass;  
  13.   
  14. import android.app.Activity;  
  15. import android.app.AlertDialog;  
  16. import android.content.DialogInterface;  
  17. import android.content.DialogInterface.OnClickListener;  
  18. import android.content.Intent;  
  19. import android.content.res.Resources;  
  20. import android.graphics.Bitmap;  
  21. import android.graphics.drawable.BitmapDrawable;  
  22. import android.graphics.drawable.Drawable;  
  23. import android.net.Uri;  
  24. import android.os.Bundle;  
  25. import android.os.Environment;  
  26. import android.os.Handler;  
  27. import android.os.Message;  
  28. import android.provider.MediaStore;  
  29. import android.view.View;  
  30. import android.widget.Button;  
  31. import android.widget.EditText;  
  32. import android.widget.ImageView;  
  33. import android.widget.Toast;  
  34.   
  35. public class Activity_UploadPic extends Activity implements Handler.Callback {  
  36.     /** Called when the activity is first created. */  
  37.   
  38.     ImageView view_pic;  
  39.     Button view_btn;  
  40.     EditText view_et;  
  41.     // 线程通知上传成功  
  42.     final Handler upLoadhand = new Handler(this);  
  43.     String[] arrayString = { "拍照", "相册" };  
  44.     String title = "上传照片";  
  45.   
  46.     // 上传的地址  
  47.     String uploadUrl = "http://192.168.1.101:8080/UploadServlet/UploadServlet?";  
  48.     String filename = "照片";  
  49.     private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照  
  50.     private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择  
  51.     private static final int PHOTO_REQUEST_CUT = 3;// 结果  
  52.   
  53.     @Override  
  54.     public boolean handleMessage(Message msg) {  
  55.   
  56.         if (msg.obj != null) {  
  57.             Drawable drawable = new BitmapDrawable((Bitmap) msg.obj);  
  58.             view_pic.setBackgroundDrawable(drawable);  
  59.             Toast.makeText(this, "获得图片并且头像上传成功", 3).show();  
  60.         }else  
  61.         {  
  62.             Toast.makeText(this, "获得图片,但是头像上传失败,请注意配置uploadUrl上传地址", 3).show();  
  63.         }  
  64.       
  65.         return false;  
  66.     }  
  67.   
  68.     // 创建一个以当前时间为名称的文件  
  69.     File tempFile = new File(Environment.getExternalStorageDirectory(),  
  70.             getPhotoFileName());  
  71.   
  72.     // 对话框  
  73.     OnClickListener onDialogClick = new OnClickListener() {  
  74.         @Override  
  75.         public void onClick(DialogInterface dialog, int which) {  
  76.             switch (which) {  
  77.             case 0:  
  78.                 startCamearPicCut(dialog);// 开启照相  
  79.                 break;  
  80.             case 1:  
  81.                 startImageCaptrue(dialog);// 开启图库  
  82.                 break;  
  83.             default:  
  84.                 break;  
  85.             }  
  86.         }  
  87.   
  88.         private void startCamearPicCut(DialogInterface dialog) {  
  89.             // TODO Auto-generated method stub  
  90.             dialog.dismiss();  
  91.             // 调用系统的拍照功能  
  92.             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  93.   
  94.             intent.putExtra("camerasensortype", 2);// 调用前置摄像头  
  95.             intent.putExtra("autofocus", true);// 自动对焦  
  96.             intent.putExtra("fullScreen", false);// 全屏  
  97.             intent.putExtra("showActionIcons", false);  
  98.             // 指定调用相机拍照后照片的储存路径  
  99.             intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));  
  100.             startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);  
  101.         }  
  102.   
  103.         private void startImageCaptrue(DialogInterface dialog) {  
  104.             // TODO Auto-generated method stub  
  105.             dialog.dismiss();  
  106.             Intent intent = new Intent(Intent.ACTION_PICK, null);  
  107.             intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  108.                     "image/*");  
  109.             startActivityForResult(intent, PHOTO_REQUEST_GALLERY);  
  110.         }  
  111.     };  
  112.   
  113.     @Override  
  114.     public void onCreate(Bundle savedInstanceState) {  
  115.         super.onCreate(savedInstanceState);  
  116.         setContentView(R.layout.main);  
  117.         init();  
  118.   
  119.     }  
  120.   
  121.     private void init() {  
  122.         // TODO Auto-generated method stub  
  123.         view_pic = (ImageView) findViewById(R.id.iv);  
  124.         view_btn = (Button) findViewById(R.id.btn);  
  125.         view_et = (EditText) findViewById(R.id.et);  
  126.         view_btn.setOnClickListener(new View.OnClickListener() {  
  127.   
  128.             @Override  
  129.             public void onClick(View v) {  
  130.                 // TODO Auto-generated method stub  
  131.                 AlertDialog.Builder dialog = AndroidClass.getListDialogBuilder(  
  132.                         Activity_UploadPic.this, arrayString, title,  
  133.                         onDialogClick);  
  134.                 dialog.show();  
  135.             }  
  136.         });  
  137.     }  
  138.   
  139.     // 使用系统当前日期加以调整作为照片的名称  
  140.     private String getPhotoFileName() {  
  141.         Date date = new Date(System.currentTimeMillis());  
  142.         SimpleDateFormat dateFormat = new SimpleDateFormat(  
  143.                 "'IMG'_yyyyMMdd_HHmmss");  
  144.         return dateFormat.format(date) + ".jpg";  
  145.     }  
  146.   
  147.     @Override  
  148.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  149.         super.onActivityResult(requestCode, resultCode, data);  
  150.         switch (requestCode) {  
  151.         case PHOTO_REQUEST_TAKEPHOTO:  
  152.             startPhotoZoom(Uri.fromFile(tempFile), 150);  
  153.             break;  
  154.   
  155.         case PHOTO_REQUEST_GALLERY:  
  156.             if (data != null) {  
  157.                 startPhotoZoom(data.getData(), 150);  
  158.             }  
  159.             break;  
  160.   
  161.         case PHOTO_REQUEST_CUT:  
  162.             if (data != null) {  
  163.                 setPicToView(data);  
  164.             }  
  165.             break;  
  166.         }  
  167.         super.onActivityResult(requestCode, resultCode, data);  
  168.     }  
  169.   
  170.     private void startPhotoZoom(Uri uri, int size) {  
  171.         Intent intent = new Intent("com.android.camera.action.CROP");  
  172.         intent.setDataAndType(uri, "image/*");  
  173.         // crop为true是设置在开启的intent中设置显示的view可以剪裁  
  174.         intent.putExtra("crop", "true");  
  175.   
  176.         // aspectX aspectY 是宽高的比例  
  177.         intent.putExtra("aspectX", 1);  
  178.         intent.putExtra("aspectY", 1);  
  179.   
  180.         // outputX,outputY 是剪裁图片的宽高  
  181.         intent.putExtra("outputX", size);  
  182.         intent.putExtra("outputY", size);  
  183.         intent.putExtra("return-data", true);  
  184.   
  185.         startActivityForResult(intent, PHOTO_REQUEST_CUT);  
  186.     }  
  187.   
  188.     // 将进行剪裁后的图片显示到UI界面上  
  189.     private void setPicToView(Intent picdata) {  
  190.         Bundle bundle = picdata.getExtras();  
  191.         if (bundle != null) {  
  192.             final Bitmap photo = bundle.getParcelable("data");  
  193.   
  194.             new Thread() {  
  195.   
  196.                 @Override  
  197.                 public void run() {  
  198.                     byte[] photodata = GraphicsBitmapUtils.Bitmap2Bytes(photo);  
  199.                     UploadFile uploadFile = new UploadFile(uploadUrl);  
  200.                     Map parameters = new HashMap();  
  201.                     parameters.put("msg", view_et.getText().toString());  
  202.                       
  203.                     boolean isUploadSuccess = false;  
  204.           
  205.                     try {  
  206.                         isUploadSuccess = uploadFile.defaultUploadMethod(  
  207.                                 photodata, filename, parameters);  
  208.                     } catch (IOException e) {  
  209.                         // TODO Auto-generated catch block  
  210.                         e.printStackTrace();  
  211.                     }  
  212.       
  213.                     if (isUploadSuccess) {  
  214.                         upLoadhand.obtainMessage(0, photo).sendToTarget();  
  215.                     } else {  
  216.                         upLoadhand.obtainMessage(-1, null).sendToTarget();  
  217.                     }  
  218.   
  219.                 }  
  220.             }.start();  
  221.   
  222.         }  
  223.     }  
  224.   
  225. }  

 

服务器端

 

  1. package com.project3gabs.action;  
  2.   
  3.   
  4.   
  5. import java.io.File;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.PrintWriter;  
  10. import java.net.URLEncoder;  
  11. import java.util.List;  
  12.   
  13. import javax.servlet.ServletException;  
  14. import javax.servlet.ServletResponse;  
  15. import javax.servlet.http.HttpServlet;  
  16. import javax.servlet.http.HttpServletRequest;  
  17. import javax.servlet.http.HttpServletResponse;  
  18.   
  19.   
  20. import org.apache.commons.fileupload.FileItem;  
  21. import org.apache.commons.fileupload.FileItemFactory;  
  22. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  23. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  24.   
  25. public class UploadServlet extends HttpServlet  
  26. {  
  27.     protected void service(HttpServletRequest request,  
  28.             HttpServletResponse response) throws ServletException, IOException  
  29.     {  
  30.           
  31.         System.out.println("服务器发现上传文件");  
  32.         System.out.println(this.getServletContext().getRealPath("/"));  
  33.           
  34.   
  35.         request.setCharacterEncoding("UTF-8");  
  36.           
  37.         if(request.getHeader("user-agent")!=null&&(request.getHeader("user-agent").toLowerCase().indexOf("mozilla")!=-1))   
  38.         {   
  39.             System.out.println("访问端-PC");  
  40.         }else   
  41.         {   
  42.             System.out.println("访问端-手机");  
  43.           
  44.         }  
  45.   
  46.           
  47.           
  48.         try {  
  49.             request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式  
  50.             response.setContentType("text/html;charset=UTF-8"); // 设置Content-Type字段值  
  51.             PrintWriter out = response.getWriter();  
  52.             System.out.println("附加信息"+URLEncoder.encode(request.getParameter("msg"),"UTF-8"));  
  53.   
  54.         } catch (Exception e1) {  
  55.             // TODO Auto-generated catch block  
  56.             e1.printStackTrace();  
  57.         }  
  58.         try  
  59.         {  
  60.               
  61.               
  62.             // 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据  
  63.             FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象  
  64.             ServletFileUpload upload = new ServletFileUpload(factory);  
  65.             // 分析请求,并得到上传文件的FileItem对象  
  66.             List<FileItem> items = upload.parseRequest(request);  
  67.             // 从web.xml文件中的参数中得到上传文件的路径  
  68.             String uploadPath = this.getServletContext().getRealPath("/")+"\upload\";  
  69.             File file = new File(uploadPath);  
  70.             if (!file.exists())  
  71.             {  
  72.                 file.mkdir();  
  73.             }  
  74.             String filename = null; // 上传文件保存到服务器的文件名  
  75.             InputStream is = null; // 当前上传文件的InputStream对象  
  76.             // 循环处理上传文件  
  77.               
  78.           
  79.               
  80.             for (FileItem item : items)  
  81.             {  
  82.                   
  83.                 // 处理普通的表单域  
  84.                 if (item.isFormField())  
  85.                 {  
  86.                     try {  
  87.                         System.out.println(item.getFieldName()+item.getString());  
  88.                     } catch (Exception e) {  
  89.                         // TODO Auto-generated catch block  
  90.                         e.printStackTrace();  
  91.                     }  
  92.                     if (item.getFieldName().equals("filename"))  
  93.                     {  
  94.                         // 如果新文件不为空,将其保存在filename中  
  95.                         if (!item.getString().equals(""))  
  96.                             filename = item.getString("UTF-8");  
  97.                         System.out.println("filename="+filename);  
  98.                     }  
  99.   
  100.                       
  101.                 }  
  102.                 // 处理上传文件  
  103.                 else if (item.getName() != null && !item.getName().equals(""))  
  104.                 {  
  105.                     // 从客户端发送过来的上传文件路径中截取文件名  
  106.                     filename = item.getName().substring(  
  107.                             item.getName().lastIndexOf("\") + 1);  
  108.                       
  109.                     is = item.getInputStream(); // 得到上传文件的InputStream对象  
  110.                   
  111.                 }  
  112.             }  
  113.             // 将路径和上传文件名组合成完整的服务端路径  
  114.             filename = uploadPath + filename;  
  115.             System.out.println("filename="+filename);  
  116.             // 如果服务器已经存在和上传文件同名的文件,则输出提示信息  
  117.             if (new File(filename).exists())  
  118.             {  
  119.                 new File(filename).delete();  
  120.             }  
  121.             // 开始上传文件  
  122.             if (!filename.equals(""))  
  123.             {  
  124.                 // 用FileOutputStream打开服务端的上传文件  
  125.                 FileOutputStream fos = new FileOutputStream(filename);  
  126.                 byte[] buffer = new byte[8192]; // 每次读8K字节  
  127.                 int count = 0;  
  128.                 // 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中  
  129.                 while ((count = is.read(buffer)) > 0)  
  130.                 {  
  131.                     fos.write(buffer, 0, count); // 向服务端文件写入字节流  
  132.                       
  133.                 }  
  134.                 fos.close(); // 关闭FileOutputStream对象  
  135.                 is.close(); // InputStream对象  
  136.                   
  137.                 System.out.println("文件上传成功!");  
  138.             }  
  139.         }  
  140.         catch (Exception e)  
  141.         {  
  142.   
  143.         }  
  144.     }  
  145. }  

 

 

本文:Demo代码下载

原文地址:https://www.cnblogs.com/Free-Thinker/p/3257745.html