Android拍照,上传,预览综合

来源:互联网 发布:苹果电脑做淘宝方便吗? 编辑:程序博客网 时间:2024/05/15 19:04

第一步

view source
print?
1try {
2     Intent intent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
3     startActivityForResult(intent, 0);
4  
5} catch(ActivityNotFoundException e) {
6     // Do nothing for now
7}

[代码] 第二步

view source
print?
01  @Override
02   protectedvoid onActivityResult(intrequestCode, intresultCode, Intent data) {
03    try{
04     if(requestCode != 0) {
05      return;
06     }
07     super.onActivityResult(requestCode, resultCode, data);
08     Bundle extras = data.getExtras();
09     Bitmap b = (Bitmap) extras.get("data");
10     //
11     
12     //
13     ImageView a = (ImageView)findViewById(R.id.imageView1);
14     a.setImageBitmap(b);
15     //
16     /*
17      * 得到图片对图片处理...
18      */
19    } catch(Exception e) {
20     // TODO: handle exception
21     System.out.println(e.getMessage());
22    }
23   }

 

 

最近需要做手机拍照([1]、调用系统相机【博客最后】;[2]、自己写照相机布局),预览,上传功能。特地研究了下android的手机拍照,其实不难。

参考:

http://blog.csdn.net/cfwdl/article/details/5746708

http://mjbb.iteye.com/blog/1018006

http://blog.csdn.net/hellogv/article/details/5962494

 

1、上传文件功能没啥好说的,网上很多讲的,只要细心点,按照格式来写发送的数据,都是没有问题的。如果遇到问题,欢迎留言讨论、

2、预览也没啥讲的,就用Gallery和ImageSwitcher就行,我做的很简单(参考代码)。

 

附上流程图:


 
拍照功能:【预览尺寸有知道的朋友留言告知。】
Java代码 复制代码 收藏代码
  1. import java.io.BufferedOutputStream;   
  2. import java.io.File;   
  3. import java.io.FileOutputStream;   
  4. import java.io.IOException;   
  5.   
  6. import android.app.Activity;   
  7. import android.app.AlertDialog;   
  8. import android.content.DialogInterface;   
  9. import android.content.Intent;   
  10. import android.graphics.Bitmap;   
  11. import android.graphics.BitmapFactory;   
  12. import android.graphics.PixelFormat;   
  13. import android.hardware.Camera;   
  14. import android.hardware.Camera.AutoFocusCallback;   
  15. import android.hardware.Camera.PictureCallback;   
  16. import android.hardware.Camera.ShutterCallback;   
  17. import android.os.Bundle;   
  18. import android.os.Environment;   
  19. import android.util.Log;   
  20. import android.view.KeyEvent;   
  21. import android.view.SurfaceHolder;   
  22. import android.view.SurfaceView;   
  23. import android.view.View;   
  24. import android.view.View.OnClickListener;   
  25. import android.widget.Button;   
  26.   
  27. import com.peacemap.photo.po.Const;   
  28. /**  
  29.  * 拍照  
  30.  * @author Administrator 
  31.  */  
  32. public class TakePhotoAct extends Activity implements SurfaceHolder.Callback{   
  33.        
  34.     private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+Const.imageDir;   
  35.        
  36.     private SurfaceView surfaceView;   //相机画布  
  37.     private SurfaceHolder surfaceHolder;    
  38.     private Button takePicView,exitView;   
  39.        
  40.     private Camera mCamera;    //照相机  
  41.        
  42.     @Override  
  43.     public void onCreate(Bundle savedInstanceState) {   
  44.            
  45.         super.onCreate(savedInstanceState);   
  46.         setContentView(R.layout.main);   
  47. //这里我在AndroidManifest.xml的activity中添加了android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  
  48.   
  49.         /**  
  50.          * 隐藏状态栏和标题栏  
  51.            
  52.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  53.         requestWindowFeature(Window.FEATURE_NO_TITLE); 
  54.         */  
  55.         //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //横屏  
  56.         /**  
  57.          * 获取Button并且设置事件监听 
  58.          */  
  59.         takePicView = (Button)this.findViewById(R.id.takepic);   
  60.         takePicView.setOnClickListener(TakePicListener);   
  61.         exitView = (Button)this.findViewById(R.id.exit);   
  62.         exitView.setOnClickListener(new OnClickListener() {   
  63.             @Override  
  64.             public void onClick(View v) {   
  65.                 finish();   
  66.             }   
  67.         });   
  68.         surfaceView = (SurfaceView)this.findViewById(R.id.surface_camera);   
  69.         surfaceHolder = surfaceView.getHolder();   
  70.         surfaceHolder.addCallback(this);   
  71.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
  72.            
  73.         checkSoftStage();  //首先检测SD卡是否存在  
  74.     }   
  75.        
  76.     /**  
  77.      * 检测手机是否存在SD卡,网络连接是否打开 
  78.      */  
  79.     private void checkSoftStage(){   
  80.         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  //判断是否存在SD卡  
  81. //          String rootPath = Environment.getExternalStorageDirectory().getPath();  //获取SD卡的根目录  
  82.             File file = new File(imgPath);   
  83.             if(!file.exists()){   
  84.                 file.mkdir();   
  85.             }   
  86.         }else{   
  87.             new AlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")   
  88.                 .setPositiveButton("确定"new DialogInterface.OnClickListener() {   
  89.                     @Override  
  90.                     public void onClick(DialogInterface dialog, int which) {   
  91.                         finish();   
  92.                     }   
  93.                 }).show();   
  94.         }   
  95.     }   
  96.        
  97.     /**  
  98.      * 点击拍照按钮,启动拍照  
  99.      */  
  100.     private final OnClickListener TakePicListener = new OnClickListener(){   
  101.         @Override  
  102.         public void onClick(View v) {   
  103.             mCamera.autoFocus(new AutoFoucus());  //自动对焦  
  104.         }   
  105.     };   
  106.        
  107.     /**  
  108.      * 自动对焦后拍照  
  109.      * @author aokunsang 
  110.      * @Date 2011-12-5 
  111.      */  
  112.     private final class AutoFoucus implements AutoFocusCallback{   
  113.         @Override  
  114.         public void onAutoFocus(boolean success, Camera camera) {   
  115.             if(success && mCamera!=null){   
  116.                 mCamera.takePicture(mShutterCallback, null, mPictureCallback);   
  117.             }   
  118.         }   
  119.     }   
  120.     /**  
  121.      * 重点对象、 此处实例化了一个本界面的PictureCallback 
  122.      * 当用户拍完一张照片的时候触发,这时候对图片处理并保存操作。 
  123.      *   
  124.      */  
  125.     private final PictureCallback mPictureCallback = new PictureCallback() {   
  126.         @Override  
  127.         public void onPictureTaken(byte[] data, Camera camera) {   
  128.             try {   
  129.                 String fileName = System.currentTimeMillis()+".jpg";   
  130.                 File file = new File(imgPath,fileName);   
  131.                 Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);   
  132.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));   
  133.                 bm.compress(Bitmap.CompressFormat.JPEG, 60, bos);   
  134.                 bos.flush();   
  135.                 bos.close();   
  136.                    
  137.                 Intent intent = new Intent(TakePhotoAct.this,PictureViewAct.class);   
  138.                 intent.putExtra("imagePath", file.getPath());   
  139.                 startActivity(intent);   
  140.             } catch (Exception e) {   
  141.                 e.printStackTrace();   
  142.             }   
  143.         }   
  144.     };   
  145.     /**   
  146.     * 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,  
  147.     * 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 例如:使设备震动  
  148.     */     
  149.     private final ShutterCallback mShutterCallback = new ShutterCallback() {     
  150.         public void onShutter() {     
  151.             Log.d("ShutterCallback""...onShutter...");     
  152.         }     
  153.     };   
  154.        
  155.     @Override  
  156.     /**  
  157.      * 初始化相机参数,比如相机的参数: 像素, 大小,格式 
  158.      */  
  159.     public void surfaceChanged(SurfaceHolder holder, int format, int width,   
  160.             int height) {   
  161.         Camera.Parameters param = mCamera.getParameters();   
  162.         /**  
  163.          * 设置拍照图片格式  
  164.          */  
  165.         param.setPictureFormat(PixelFormat.JPEG);   
  166.         /**  
  167.          * 设置预览尺寸【这里需要注意:预览尺寸有些数字正确,有些会报错,不清楚为啥】 
  168.          */  
  169.         //param.setPreviewSize(320, 240);  
  170.         /**  
  171.          * 设置图片大小  
  172.          */  
  173.         param.setPictureSize(Const.width, Const.height);   
  174.         mCamera.setParameters(param);   
  175.         /**  
  176.          * 开始预览  
  177.          */  
  178.         mCamera.startPreview();   
  179.     }   
  180.     @Override  
  181.     /**  
  182.      * 打开相机,设置预览  
  183.      */  
  184.     public void surfaceCreated(SurfaceHolder holder) {   
  185.         try {   
  186.             mCamera = Camera.open();  //打开摄像头  
  187.             mCamera.setPreviewDisplay(holder);   
  188.         } catch (IOException e) {   
  189.             mCamera.release();   
  190.             mCamera = null;   
  191.         }   
  192.     }   
  193.        
  194.     @Override  
  195.     /**  
  196.      * 预览界面被关闭时,或者停止相机拍摄;释放相机资源 
  197.      */  
  198.     public void surfaceDestroyed(SurfaceHolder holder) {   
  199.         mCamera.stopPreview();   
  200.         if(mCamera!=null) mCamera.release();   
  201.         mCamera = null;   
  202.     }   
  203.        
  204.     @Override  
  205.     public boolean onKeyDown(int keyCode, KeyEvent event) {   
  206.         if(keyCode == KeyEvent.KEYCODE_CAMERA){   //按下相机实体按键,启动本程序照相功能  
  207.             mCamera.autoFocus(new AutoFoucus());  //自动对焦  
  208.             return true;   
  209.         }else{   
  210.             return false;   
  211.         }   
  212.     }   
  213. }  
  xml:
Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <SurfaceView    
  8.         android:id="@+id/surface_camera"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:layout_weight="1"  
  12.     />  
  13. <LinearLayout    
  14.     android:orientation="horizontal"  
  15.     android:layout_width="fill_parent"  
  16.     android:layout_height="wrap_content">  
  17.        
  18.     <Button    
  19.         android:text="拍照"  
  20.         android:layout_width="wrap_content"  
  21.         android:layout_height="wrap_content"  
  22.         android:id="@+id/takepic"  
  23.     />  
  24.     <Button    
  25.         android:text="退出"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:id="@+id/exit"  
  29.     />  
  30. </LinearLayout>  
  31. </LinearLayout>  
 预览功能:
Java代码 复制代码 收藏代码
  1. import java.io.File;   
  2. import java.util.ArrayList;   
  3. import java.util.List;   
  4.   
  5. import android.app.Activity;   
  6. import android.app.AlertDialog;   
  7. import android.content.ComponentName;   
  8. import android.content.DialogInterface;   
  9. import android.content.Intent;   
  10. import android.graphics.Bitmap;   
  11. import android.graphics.BitmapFactory;   
  12. import android.graphics.drawable.BitmapDrawable;   
  13. import android.os.Bundle;   
  14. import android.os.Environment;   
  15. import android.util.Log;   
  16. import android.view.Menu;   
  17. import android.view.MenuItem;   
  18. import android.view.MotionEvent;   
  19. import android.view.View;   
  20. import android.view.View.OnTouchListener;   
  21. import android.view.animation.AnimationUtils;   
  22. import android.widget.AdapterView;   
  23. import android.widget.Gallery;   
  24. import android.widget.ImageSwitcher;   
  25. import android.widget.ImageView;   
  26. import android.widget.LinearLayout.LayoutParams;   
  27. import android.widget.ViewSwitcher.ViewFactory;   
  28.   
  29. import com.peacemap.photo.adapter.ImageAdapter;   
  30. import com.peacemap.photo.po.Const;   
  31.   
  32. /**  
  33.  * 图片浏览  
  34.  * @author aokunsang  
  35.  * @Date 2011-12-6  
  36.  */  
  37. public class PhotoScanAct extends Activity implements ViewFactory{   
  38.   
  39.        
  40.     private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+Const.imageDir;   
  41.        
  42.     private ImageSwitcher imageSwitcher;     
  43.     private Gallery gallery;   
  44.     private List<String> photoList;   
  45.     private int downX,upX;   
  46.     private String newFilePath;   
  47.        
  48.     @Override  
  49.     protected void onCreate(Bundle savedInstanceState) {   
  50.         super.onCreate(savedInstanceState);   
  51.         setContentView(R.layout.photoscan);   
  52.            
  53.         photoList = readFileList();   
  54.            
  55.         imageSwitcher = (ImageSwitcher)findViewById(R.id.switcher);   
  56.         imageSwitcher.setFactory(this);   
  57.         /*  
  58.          * 淡入淡出效果  
  59.          */  
  60.         imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,     
  61.                 android.R.anim.fade_in));     
  62.         imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,     
  63.                 android.R.anim.fade_out));   
  64.         imageSwitcher.setOnTouchListener(touchListener);   
  65.         gallery = (Gallery)findViewById(R.id.gallery);   
  66.         gallery.setAdapter(new ImageAdapter(this, photoList));   
  67.         gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {   
  68.             @Override  
  69.             public void onItemSelected(AdapterView<?> arg0, View arg1,   
  70.                     int position, long when) {   
  71.                 newFilePath = photoList.get(position);   
  72.                 Bitmap bm = BitmapFactory.decodeFile(photoList.get(position));   
  73.                 BitmapDrawable bd = new BitmapDrawable(bm);   
  74.                 imageSwitcher.setImageDrawable(bd);   
  75.             }   
  76.             @Override  
  77.             public void onNothingSelected(AdapterView<?> arg0) {}   
  78.         });   
  79.     }   
  80.        
  81.     /**  
  82.      * 注册一个触摸事件  
  83.      */  
  84.     private OnTouchListener touchListener = new View.OnTouchListener() {   
  85.         @Override  
  86.         public boolean onTouch(View v, MotionEvent event) {   
  87.              if(event.getAction()==MotionEvent.ACTION_DOWN)     
  88.                 {     
  89.                     downX=(int) event.getX();//取得按下时的坐标    
  90.                     return true;     
  91.                 }     
  92.                 else if(event.getAction()==MotionEvent.ACTION_UP)     
  93.                 {     
  94.                     upX=(int) event.getX();//取得松开时的坐标    
  95.                     int index=0;     
  96.                     if(upX-downX>100)//从左拖到右,即看前一张    
  97.                     {     
  98.                         //如果是第一,则去到尾部    
  99.                         if(gallery.getSelectedItemPosition()==0)     
  100.                            index=gallery.getCount()-1;     
  101.                         else     
  102.                             index=gallery.getSelectedItemPosition()-1;     
  103.                     }     
  104.                     else if(downX-upX>100)//从右拖到左,即看后一张    
  105.                     {     
  106.                         //如果是最后,则去到第一    
  107.                         if(gallery.getSelectedItemPosition()==(gallery.getCount()-1))     
  108.                             index=0;     
  109.                         else     
  110.                             index=gallery.getSelectedItemPosition()+1;     
  111.                     }     
  112.                     //改变gallery图片所选,自动触发ImageSwitcher的setOnItemSelectedListener    
  113.                     gallery.setSelection(index, true);     
  114.                     return true;     
  115.                 }     
  116.                 return false;     
  117.             }   
  118.     };   
  119.     /**  
  120.      * 获取SD卡中的所有图片路径  
  121.      * @return  
  122.      */  
  123.     private List<String> readFileList(){   
  124.         List<String> fileList = new ArrayList<String>();   
  125.         File fileDir = new File(imgPath);   
  126.         File[] files = fileDir.listFiles();   
  127.         if(files!=null){   
  128.             for(File file:files){   
  129.                 String fileName = file.getName();   
  130.                 if (fileName.lastIndexOf(".") > 0     
  131.                         && fileName.substring(fileName.lastIndexOf(".") + 1,     
  132.                         fileName.length()).equals("jpg")){   
  133.                     fileList.add(file.getPath());   
  134.                 }   
  135.             }   
  136.         }   
  137.         return fileList;   
  138.     }   
  139.   
  140.     @Override  
  141.     public View makeView() {   
  142.         ImageView imageView = new ImageView(this);   
  143.         imageView.setScaleType(ImageView.ScaleType.CENTER);   
  144.         imageView.setLayoutParams(new ImageSwitcher.LayoutParams(//自适应图片大小    
  145.                 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));   
  146.         return imageView;   
  147.     }   
  148.        
  149.     //声明2个menu键按钮  
  150.     public final static int ITEM_1_ID = Menu.FIRST;   
  151.     public final static int ITEM_2_ID = Menu.FIRST+1;   
  152.        
  153.     @Override  
  154.     public boolean onCreateOptionsMenu(Menu menu) {   
  155.         super.onCreateOptionsMenu(menu);   
  156.         menu.add(0, ITEM_1_ID, 0"我要上传");   
  157.         menu.add(0, ITEM_2_ID, 1"我要拍照");   
  158.         return true;   
  159.     }   
  160.        
  161.     @Override  
  162.     public boolean onOptionsItemSelected(MenuItem item) {   
  163.         super.onOptionsItemSelected(item);   
  164.         switch(item.getItemId()){   
  165.             case 1:{  //调出系统设置界面  
  166.                 Intent intent = new Intent(PhotoScanAct.this,PictureViewAct.class);   
  167.                 intent.putExtra("imagePath",newFilePath);   
  168.                 startActivity(intent);   
  169.                 break;   
  170.             }   
  171.             case 2:{ //拍照  
  172.                 startActivity(new Intent(this,TakePhotoAct.class));   
  173.                 break;   
  174.             }   
  175.         }   
  176.         return true;   
  177.     }   
  178. }  
  ImageAdapter适配器:
Java代码 复制代码 收藏代码
  1. import java.util.List;   
  2.   
  3. import android.content.Context;   
  4. import android.graphics.Bitmap;   
  5. import android.graphics.BitmapFactory;   
  6. import android.view.View;   
  7. import android.view.ViewGroup;   
  8. import android.widget.BaseAdapter;   
  9. import android.widget.Gallery;   
  10. import android.widget.ImageView;   
  11.   
  12. /**  
  13.  * 图片适配器  
  14.  * @author aokunsang  
  15.  * @Date 2011-12-6  
  16.  */  
  17. public class ImageAdapter extends BaseAdapter {   
  18.   
  19.     private List<String> picList;   
  20.     private Context mContext;   
  21.     public ImageAdapter(Context mContext,List<String> picList){   
  22.         this.mContext = mContext;   
  23.         this.picList = picList;   
  24.     }   
  25.        
  26.     @Override  
  27.     public int getCount() {   
  28.         return picList.size();   
  29.     }   
  30.   
  31.     /* (non-Javadoc) 
  32.      * @see android.widget.Adapter#getItem(int) 
  33.      */  
  34.     @Override  
  35.     public Object getItem(int position) {   
  36.         // TODO Auto-generated method stub  
  37.         return picList.get(position);   
  38.     }   
  39.   
  40.     /* (non-Javadoc) 
  41.      * @see android.widget.Adapter#getItemId(int) 
  42.      */  
  43.     @Override  
  44.     public long getItemId(int position) {   
  45.         // TODO Auto-generated method stub  
  46.         return position;   
  47.     }   
  48.   
  49.     @Override  
  50.     public View getView(int position, View convertView, ViewGroup parent) {   
  51.         ImageView image = new ImageView(mContext);   
  52.         Bitmap bm = BitmapFactory.decodeFile(picList.get(position));   
  53.         image.setImageBitmap(bm);   
  54.         image.setScaleType(ImageView.ScaleType.CENTER_CROP);   
  55.         image.setLayoutParams(new Gallery.LayoutParams(100100));   
  56.         return image;   
  57.     }   
  58. }  
 xml:
Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="match_parent"  
  5.   android:layout_height="match_parent">  
  6.      
  7.     <ImageSwitcher    
  8.         android:id="@+id/switcher"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.     ></ImageSwitcher>  
  12.        
  13.    <Gallery    
  14.         android:id="@+id/gallery"  
  15.         android:layout_width="match_parent"  
  16.         android:background="#55000000"  
  17.         android:layout_height="100dip"  
  18.         android:layout_alignParentBottom="true"     
  19.         android:layout_alignParentLeft="true"  
  20.         android:gravity="center_vertical"  
  21.         android:spacing="8dip"  
  22.    />    
  23. </RelativeLayout>  
 上传工具类:
Java代码 复制代码 收藏代码
  1. import java.io.BufferedReader;   
  2. import java.io.DataOutputStream;   
  3. import java.io.FileInputStream;   
  4. import java.io.InputStream;   
  5. import java.io.InputStreamReader;   
  6. import java.net.HttpURLConnection;   
  7. import java.net.URL;   
  8. import java.util.Map;   
  9. import java.util.Map.Entry;   
  10.   
  11. import android.util.Log;   
  12.   
  13. import com.peacemap.photo.po.FileInfo;   
  14.   
  15. /**  
  16.  * POST上传文件  
  17.  * @author aokunsang  
  18.  * @Date 2011-12-6  
  19.  */  
  20. public class PostFile {   
  21.   
  22.     private static PostFile postFile = new PostFile();   
  23.        
  24.     private final static String LINEND = "\r\n";   
  25.     private final static String BOUNDARY = "---------------------------7da2137580612"//数据分隔线  
  26.     private final static String PREFIX = "--";   
  27.     private final static String MUTIPART_FORMDATA = "multipart/form-data";   
  28.     private final static String CHARSET = "utf-8";   
  29.     private final static String CONTENTTYPE = "application/octet-stream";   
  30.        
  31.     private PostFile(){}   
  32.     public static PostFile getInstance(){   
  33.         return postFile;   
  34.     }   
  35.        
  36.     /**  
  37.      * HTTP上传文件  
  38.      * @param actionUrl  请求服务器的路径 
  39.      * @param params     传递的表单内容 
  40.      * @param files      多个文件信息 
  41.      * @return  
  42.      */  
  43.     public String post(String actionUrl,Map<String,String> params,FileInfo[] files){   
  44.         try {   
  45.             URL url = new URL(actionUrl);   
  46.             HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();   
  47.             urlConn.setDoOutput(true);   //允许输出  
  48.             urlConn.setDoInput(true);   //允许输入  
  49.             urlConn.setUseCaches(false);   
  50.             urlConn.setRequestMethod("POST");   
  51.             urlConn.setRequestProperty("connection""Keep-Alive");   
  52.             urlConn.setRequestProperty("Charset", CHARSET);   
  53.             urlConn.setRequestProperty("Content-Type", MUTIPART_FORMDATA+";boundary="+BOUNDARY);   
  54.                
  55.             DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());   
  56.             //构建表单数据  
  57.             String entryText = bulidFormText(params);   
  58.             Log.i("-------描述信息---------------", entryText);   
  59.             dos.write(entryText.getBytes());   
  60.                
  61.             StringBuffer sb = new StringBuffer("");   
  62.        
  63.             for(FileInfo file : files){   
  64.                 sb.append(PREFIX).append(BOUNDARY).append(LINEND);   
  65.                 sb.append("Content-Disposition: form-data; name=\""+file.getFileTextName()+"\"; filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);   
  66.                 sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);   
  67.                 sb.append(LINEND);   
  68.                 dos.write(sb.toString().getBytes());   
  69.                    
  70.                 InputStream is = new FileInputStream(file.getFile());   
  71.                 byte[] buffer = new byte[1024];   
  72.                 int len = 0;   
  73.                 while ((len = is.read(buffer)) != -1) {   
  74.                     dos.write(buffer, 0, len);   
  75.                 }   
  76.                 is.close();   
  77.                 dos.write(LINEND.getBytes());   
  78.             }   
  79.             //请求的结束标志  
  80.             byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();   
  81.             dos.write(end_data);   
  82.             dos.flush();   
  83.     //-----------------------------------  发送请求数据结束  ----------------------------  
  84.                
  85.     //----------------------------------   接收返回信息 ------------------------  
  86.                
  87.             int code = urlConn.getResponseCode();   
  88.             if(code!=200){   
  89.                 urlConn.disconnect();   
  90.                 return "";   
  91.             }else{   
  92.                 BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));   
  93.                 String result = "";   
  94.                 String line = null;   
  95.                 while((line = br.readLine())!=null){   
  96.                     result += line;   
  97.                 }   
  98.                 br.close();   
  99.                 urlConn.disconnect();   
  100.                 return result;   
  101.             }   
  102.         } catch (Exception e) {   
  103.             Log.e("--------上传图片错误--------", e.getMessage());   
  104.             return null;   
  105.         }   
  106.     }   
  107.        
  108.     /**  
  109.      * HTTP上传单个文件  
  110.      * @param actionUrl  请求服务器的路径 
  111.      * @param params     传递的表单内容 
  112.      * @param files      单个文件信息 
  113.      * @return  
  114.      */  
  115.     public String post(String actionUrl,Map<String,String> params,FileInfo fileInfo){   
  116.         return post(actionUrl, params, new FileInfo[]{fileInfo});   
  117.     }   
  118.        
  119.     /**  
  120.      * 封装表单文本数据  
  121.      * @param paramText 
  122.      * @return  
  123.      */  
  124.     private String bulidFormText(Map<String,String> paramText){   
  125.         if(paramText==null || paramText.isEmpty()) return "";   
  126.         StringBuffer sb = new StringBuffer("");   
  127.         for(Entry<String,String> entry : paramText.entrySet()){    
  128.             sb.append(PREFIX).append(BOUNDARY).append(LINEND);   
  129.             sb.append("Content-Disposition:form-data;name=\""  
  130.                     + entry.getKey() + "\"" + LINEND);   
  131. //          sb.append("Content-Type:text/plain;charset=" + CHARSET + LINEND);  
  132.             sb.append(LINEND);   
  133.             sb.append(entry.getValue());   
  134.             sb.append(LINEND);   
  135.         }   
  136.         return sb.toString();   
  137.     }   
  138.     /**  
  139.      * 封装文件文本数据  
  140.      * @param files  
  141.      * @return  
  142.      */  
  143.     private String buildFromFile(FileInfo[] files){   
  144.         StringBuffer sb = new StringBuffer();   
  145.         for(FileInfo file : files){   
  146.             sb.append(PREFIX).append(BOUNDARY).append(LINEND);   
  147.             sb.append("Content-Disposition: form-data; name=\""+file.getFileTextName()+"\"; filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);   
  148.             sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);   
  149.             sb.append(LINEND);   
  150.         }   
  151.         return sb.toString();   
  152.     }   
  153. }  
 

-------------------------------------我是个华丽的分割线,哇哈哈-----------------------------------------------

做完这个拍照后,感觉功能太简单,比如:设置图片大小,白天夜晚照相等等一些系统照相机带的功能都没有,因此用在项目中感觉不炫。 然后就用了简单点的,直接调用系统照相机了。本来想着简单呢,后来也遇到点问题。
    (1)根据Camera Activity返回的时候,会带一个名为data的Bitmap对象,照片的缩略图(这个地方可以做各种修改,我没用到不说了),上代码
Java代码 复制代码 收藏代码
  1.  @Override     
  2.    public void onCreate(Bundle savedInstanceState) {   
  3.        super.onCreate(savedInstanceState);   
  4.        checkSoftStage();   
  5.           
  6.        try {   
  7.            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);   
  8.            startActivityForResult(intent, TAKE_PICTURE);    
  9.        } catch (Exception e) {   
  10.            e.printStackTrace();   
  11.        }   
  12. }   
  13.  /**  
  14.      * 检测手机是否存在SD卡,网络连接是否打开 
  15.      */  
  16.     private void checkSoftStage(){   
  17.         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  //判断是否存在SD卡  
  18.             File file = new File(imgPath);   
  19.             if(!file.exists()){   
  20.                 file.mkdir();   
  21.             }   
  22.         }else{   
  23.             new AlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")   
  24.                 .setPositiveButton("确定"new DialogInterface.OnClickListener() {   
  25.                     @Override  
  26.                     public void onClick(DialogInterface dialog, int which) {   
  27.                         finish();   
  28.                     }   
  29.                 }).show();   
  30.         }   
  31.     }   
  32.  protected void onActivityResult(int requestCode, int resultCode, Intent data)  {            
  33.             if (resultCode == TAKE_PICTURE)      {             
  34.                 //  拍照Activity保存图像数据的key是data,返回的数据类型是Bitmap对象            
  35.                 Bitmap cameraBitmap = (Bitmap) data.getExtras().get("/sdcard/rtest.jpg");            
  36.                 //  在ImageView组件中显示拍摄的照片           
  37.                 image.setImageBitmap(cameraBitmap);    
  38.   
  39.                 // 做自己的业务操作。。。。  
  40.                 }         
  41.       super.onActivityResult(requestCode, resultCode, data);     
  42.                 }   
 
   (2)以上代码在我的小米手机上测试时,出现问题了。 返回的name为data的Bitmap对象是个Null,我发现小米照完相片之后,他会先跳到一个预览的界面(系统自带的页面),所以得不到Bitmap对象了。
因此我就先保存照片以及其路径,然后在onActivityResult中获取图片,做业务操作,代码如下:
Java代码 复制代码 收藏代码
  1.   public void onCreate(Bundle savedInstanceState) {   
  2.    super.onCreate(savedInstanceState);   
  3.    checkSoftStage();   
  4.       
  5.    try {   
  6.        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);   
  7.        startActivityForResult(intent, TAKE_PICTURE);    
  8.    } catch (Exception e) {   
  9.        e.printStackTrace();   
  10.    }   
  11.       
  12.    try {   
  13.        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);   
  14.        String fileName = System.currentTimeMillis()+".jpg";   
  15.        newImgPath = imgPath + "/" + fileName;   
  16.        Uri uri = Uri.fromFile(new File(imgPath,fileName));   
  17.        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);   
  18.        startActivityForResult(intent, TAKE_PICTURE);    
  19.       } catch (Exception e) {   
  20.           e.printStackTrace();   
  21.       }    
  22.   }   
  23. @Override    
  24.   protected void onActivityResult(int requestCode,    
  25.    int resultCode, Intent data) {    
  26.        Log.i("--------图片路径---------""------"+newImgPath+"---------");   
  27.       //.....做一些业务操作  
  28.     } catch (Exception e) {   
  29.         e.printStackTrace();   
  30.     }   
  31.     super.onActivityResult(requestCode, resultCode, data);   
  32.   }