Android拍照,上传,预览综合

发布时间:2024-01-11 02:41:39

第一步

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

[代码] 第二步

01  @Override
02   protected void onActivityResult(int requestCode, int resultCode, 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. }??
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.peacemap.photo.po.Const;
/**
 * 拍照
 * @author Administrator
 */
public class TakePhotoAct extends Activity implements SurfaceHolder.Callback{
	
	private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+Const.imageDir;
	
	private SurfaceView surfaceView;   //相机画布
	private SurfaceHolder surfaceHolder; 
	private Button takePicView,exitView;
	
	private Camera mCamera;    //照相机
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
		
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
//这里我在AndroidManifest.xml的activity中添加了android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

        /**
         * 隐藏状态栏和标题栏
         
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        */
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //横屏
        /**
         * 获取Button并且设置事件监听
         */
        takePicView = (Button)this.findViewById(R.id.takepic);
        takePicView.setOnClickListener(TakePicListener);
        exitView = (Button)this.findViewById(R.id.exit);
        exitView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
        surfaceView = (SurfaceView)this.findViewById(R.id.surface_camera);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        
        checkSoftStage();  //首先检测SD卡是否存在
    }
	
	/**
	 * 检测手机是否存在SD卡,网络连接是否打开
	 */
	private void checkSoftStage(){
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  //判断是否存在SD卡
//			String rootPath = Environment.getExternalStorageDirectory().getPath();  //获取SD卡的根目录
			File file = new File(imgPath);
			if(!file.exists()){
				file.mkdir();
			}
		}else{
			new AlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")
				.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						finish();
					}
				}).show();
		}
	}
	
	/**
	 * 点击拍照按钮,启动拍照
	 */
	private final OnClickListener TakePicListener = new OnClickListener(){
		@Override
		public void onClick(View v) {
			mCamera.autoFocus(new AutoFoucus());  //自动对焦
		}
	};
	
	/**
	 * 自动对焦后拍照
	 * @author aokunsang
	 * @Date 2011-12-5
	 */
	private final class AutoFoucus implements AutoFocusCallback{
		@Override
		public void onAutoFocus(boolean success, Camera camera) {
			if(success && mCamera!=null){
				mCamera.takePicture(mShutterCallback, null, mPictureCallback);
			}
		}
	}
	/**
	 * 重点对象、 此处实例化了一个本界面的PictureCallback
	 * 当用户拍完一张照片的时候触发,这时候对图片处理并保存操作。
	 * 
	 */
	private final PictureCallback mPictureCallback = new PictureCallback() {
		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			try {
				String fileName = System.currentTimeMillis()+".jpg";
				File file = new File(imgPath,fileName);
				Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
				bm.compress(Bitmap.CompressFormat.JPEG, 60, bos);
				bos.flush();
				bos.close();
				
				Intent intent = new Intent(TakePhotoAct.this,PictureViewAct.class);
				intent.putExtra("imagePath", file.getPath());
				startActivity(intent);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	};
	/** 
	* 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件, 
	* 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 例如:使设备震动 
	*/  
	private final ShutterCallback mShutterCallback = new ShutterCallback() {  
		public void onShutter() {  
			Log.d("ShutterCallback", "...onShutter...");  
		}  
	};
	
	@Override
	/**
	 * 初始化相机参数,比如相机的参数: 像素, 大小,格式
	 */
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		Camera.Parameters param = mCamera.getParameters();
		/**
		 * 设置拍照图片格式
		 */
		param.setPictureFormat(PixelFormat.JPEG);
		/**
		 * 设置预览尺寸【这里需要注意:预览尺寸有些数字正确,有些会报错,不清楚为啥】
		 */
		//param.setPreviewSize(320, 240);
		/**
		 * 设置图片大小
		 */
		param.setPictureSize(Const.width, Const.height);
		mCamera.setParameters(param);
		/**
		 * 开始预览
		 */
		mCamera.startPreview();
	}
	@Override
	/**
	 * 打开相机,设置预览
	 */
	public void surfaceCreated(SurfaceHolder holder) {
		try {
			mCamera = Camera.open();  //打开摄像头
			mCamera.setPreviewDisplay(holder);
		} catch (IOException e) {
			mCamera.release();
			mCamera = null;
		}
	}
	
	@Override
	/**
	 * 预览界面被关闭时,或者停止相机拍摄;释放相机资源
	 */
	public void surfaceDestroyed(SurfaceHolder holder) {
		mCamera.stopPreview();
		if(mCamera!=null) mCamera.release();
		mCamera = null;
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_CAMERA){   //按下相机实体按键,启动本程序照相功能
			mCamera.autoFocus(new AutoFoucus());  //自动对焦
			return true;
		}else{
			return false;
		}
	}
}
??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. }??
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ViewSwitcher.ViewFactory;

import com.peacemap.photo.adapter.ImageAdapter;
import com.peacemap.photo.po.Const;

/**
 * 图片浏览
 * @author aokunsang
 * @Date 2011-12-6
 */
public class PhotoScanAct extends Activity implements ViewFactory{

	
	private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+Const.imageDir;
	
	private ImageSwitcher imageSwitcher;  
    private Gallery gallery;
    private List<String> photoList;
    private int downX,upX;
    private String newFilePath;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.photoscan);
		
		photoList = readFileList();
		
		imageSwitcher = (ImageSwitcher)findViewById(R.id.switcher);
		imageSwitcher.setFactory(this);
		/*
		 * 淡入淡出效果
		 */
		imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,  
                android.R.anim.fade_in));  
		imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,  
                android.R.anim.fade_out));
		imageSwitcher.setOnTouchListener(touchListener);
		gallery = (Gallery)findViewById(R.id.gallery);
		gallery.setAdapter(new ImageAdapter(this, photoList));
		gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int position, long when) {
				newFilePath = photoList.get(position);
				Bitmap bm = BitmapFactory.decodeFile(photoList.get(position));
				BitmapDrawable bd = new BitmapDrawable(bm);
				imageSwitcher.setImageDrawable(bd);
			}
			@Override
			public void onNothingSelected(AdapterView<?> arg0) {}
		});
	}
	
	/**
	 * 注册一个触摸事件
	 */
	private OnTouchListener touchListener = new View.OnTouchListener() {
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			 if(event.getAction()==MotionEvent.ACTION_DOWN)  
                {  
                    downX=(int) event.getX();//取得按下时的坐标  
                    return true;  
                }  
                else if(event.getAction()==MotionEvent.ACTION_UP)  
                {  
                    upX=(int) event.getX();//取得松开时的坐标  
                    int index=0;  
                    if(upX-downX>100)//从左拖到右,即看前一张  
                    {  
                        //如果是第一,则去到尾部  
                        if(gallery.getSelectedItemPosition()==0)  
                           index=gallery.getCount()-1;  
                        else  
                            index=gallery.getSelectedItemPosition()-1;  
                    }  
                    else if(downX-upX>100)//从右拖到左,即看后一张  
                    {  
                        //如果是最后,则去到第一  
                        if(gallery.getSelectedItemPosition()==(gallery.getCount()-1))  
                            index=0;  
                        else  
                            index=gallery.getSelectedItemPosition()+1;  
                    }  
                    //改变gallery图片所选,自动触发ImageSwitcher的setOnItemSelectedListener  
                    gallery.setSelection(index, true);  
                    return true;  
                }  
                return false;  
            }
	};
	/**
	 * 获取SD卡中的所有图片路径
	 * @return
	 */
	private List<String> readFileList(){
		List<String> fileList = new ArrayList<String>();
		File fileDir = new File(imgPath);
		File[] files = fileDir.listFiles();
		if(files!=null){
			for(File file:files){
				String fileName = file.getName();
				if (fileName.lastIndexOf(".") > 0  
						&& fileName.substring(fileName.lastIndexOf(".") + 1,  
						fileName.length()).equals("jpg")){
					fileList.add(file.getPath());
				}
			}
		}
		return fileList;
	}

	@Override
	public View makeView() {
		ImageView imageView = new ImageView(this);
		imageView.setScaleType(ImageView.ScaleType.CENTER);
		imageView.setLayoutParams(new ImageSwitcher.LayoutParams(//自适应图片大小  
                LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
		return imageView;
	}
	
	//声明2个menu键按钮
	public final static int ITEM_1_ID = Menu.FIRST;
	public final static int ITEM_2_ID = Menu.FIRST+1;
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, ITEM_1_ID, 0, "我要上传");
		menu.add(0, ITEM_2_ID, 1, "我要拍照");
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		super.onOptionsItemSelected(item);
		switch(item.getItemId()){
			case 1:{  //调出系统设置界面
				Intent intent = new Intent(PhotoScanAct.this,PictureViewAct.class);
				intent.putExtra("imagePath",newFilePath);
				startActivity(intent);
				break;
			}
			case 2:{ //拍照
				startActivity(new Intent(this,TakePhotoAct.class));
				break;
			}
		}
		return true;
	}
}
??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(100,?100)); ??
  56. ????????return?image; ??
  57. ????} ??
  58. }??
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

/**
 * 图片适配器
 * @author aokunsang
 * @Date 2011-12-6
 */
public class ImageAdapter extends BaseAdapter {

	private List<String> picList;
	private Context mContext;
	public ImageAdapter(Context mContext,List<String> picList){
		this.mContext = mContext;
		this.picList = picList;
	}
	
	@Override
	public int getCount() {
		return picList.size();
	}

	/* (non-Javadoc)
	 * @see android.widget.Adapter#getItem(int)
	 */
	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return picList.get(position);
	}

	/* (non-Javadoc)
	 * @see android.widget.Adapter#getItemId(int)
	 */
	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView image = new ImageView(mContext);
		Bitmap bm = BitmapFactory.decodeFile(picList.get(position));
		image.setImageBitmap(bm);
		image.setScaleType(ImageView.ScaleType.CENTER_CROP);
		image.setLayoutParams(new Gallery.LayoutParams(100, 100));
		return image;
	}
}
?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. }??
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;

import android.util.Log;

import com.peacemap.photo.po.FileInfo;

/**
 * POST上传文件
 * @author aokunsang
 * @Date 2011-12-6
 */
public class PostFile {

	private static PostFile postFile = new PostFile();
	
	private final static String LINEND = "\r\n";
	private final static String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
	private final static String PREFIX = "--";
	private final static String MUTIPART_FORMDATA = "multipart/form-data";
	private final static String CHARSET = "utf-8";
	private final static String CONTENTTYPE = "application/octet-stream";
	
	private PostFile(){}
	public static PostFile getInstance(){
		return postFile;
	}
	
	/**
	 * HTTP上传文件
	 * @param actionUrl  请求服务器的路径
	 * @param params     传递的表单内容
	 * @param files      多个文件信息
	 * @return
	 */
	public String post(String actionUrl,Map<String,String> params,FileInfo[] files){
		try {
			URL url = new URL(actionUrl);
			HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
			urlConn.setDoOutput(true);   //允许输出
			urlConn.setDoInput(true);   //允许输入
			urlConn.setUseCaches(false);
			urlConn.setRequestMethod("POST");
			urlConn.setRequestProperty("connection", "Keep-Alive");
			urlConn.setRequestProperty("Charset", CHARSET);
			urlConn.setRequestProperty("Content-Type", MUTIPART_FORMDATA+";boundary="+BOUNDARY);
			
			DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
			//构建表单数据
			String entryText = bulidFormText(params);
			Log.i("-------描述信息---------------", entryText);
			dos.write(entryText.getBytes());
			
			StringBuffer sb = new StringBuffer("");
	
			for(FileInfo file : files){
				sb.append(PREFIX).append(BOUNDARY).append(LINEND);
				sb.append("Content-Disposition: form-data; name=\""+file.getFileTextName()+"\"; filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);
				sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);
				sb.append(LINEND);
				dos.write(sb.toString().getBytes());
				
				InputStream is = new FileInputStream(file.getFile());
				byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = is.read(buffer)) != -1) {
                	dos.write(buffer, 0, len);
                }
                is.close();
                dos.write(LINEND.getBytes());
			}
			//请求的结束标志
			byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
			dos.write(end_data);
			dos.flush();
	//-----------------------------------  发送请求数据结束  ----------------------------
			
    //----------------------------------   接收返回信息 ------------------------
			
			int code = urlConn.getResponseCode();
			if(code!=200){
				urlConn.disconnect();
				return "";
			}else{
				BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
				String result = "";
				String line = null;
				while((line = br.readLine())!=null){
					result += line;
				}
				br.close();
				urlConn.disconnect();
				return result;
			}
		} catch (Exception e) {
			Log.e("--------上传图片错误--------", e.getMessage());
			return null;
		}
	}
	
	/**
	 * HTTP上传单个文件
	 * @param actionUrl  请求服务器的路径
	 * @param params     传递的表单内容
	 * @param files      单个文件信息
	 * @return
	 */
	public String post(String actionUrl,Map<String,String> params,FileInfo fileInfo){
		return post(actionUrl, params, new FileInfo[]{fileInfo});
	}
	
	/**
	 * 封装表单文本数据
	 * @param paramText
	 * @return
	 */
	private String bulidFormText(Map<String,String> paramText){
		if(paramText==null || paramText.isEmpty()) return "";
		StringBuffer sb = new StringBuffer("");
		for(Entry<String,String> entry : paramText.entrySet()){ 
			sb.append(PREFIX).append(BOUNDARY).append(LINEND);
			sb.append("Content-Disposition:form-data;name=\""
                    + entry.getKey() + "\"" + LINEND);
//			sb.append("Content-Type:text/plain;charset=" + CHARSET + LINEND);
			sb.append(LINEND);
			sb.append(entry.getValue());
			sb.append(LINEND);
		}
		return sb.toString();
	}
	/**
	 * 封装文件文本数据
	 * @param files
	 * @return
	 */
	private String buildFromFile(FileInfo[] files){
		StringBuffer sb = new StringBuffer();
		for(FileInfo file : files){
			sb.append(PREFIX).append(BOUNDARY).append(LINEND);
			sb.append("Content-Disposition: form-data; name=\""+file.getFileTextName()+"\"; filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);
			sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);
			sb.append(LINEND);
		}
		return sb.toString();
	}
}
?

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

做完这个拍照后,感觉功能太简单,比如:设置图片大小,白天夜晚照相等等一些系统照相机带的功能都没有,因此用在项目中感觉不炫。 然后就用了简单点的,直接调用系统照相机了。本来想着简单呢,后来也遇到点问题。
?? ?(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. ????????????????}???
 @Override  
   public void onCreate(Bundle savedInstanceState) {
	   super.onCreate(savedInstanceState);
	   checkSoftStage();
	   
	   try {
		   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		   startActivityForResult(intent, TAKE_PICTURE); 
	   } catch (Exception e) {
		   e.printStackTrace();
	   }
}
 /**
	 * 检测手机是否存在SD卡,网络连接是否打开
	 */
	private void checkSoftStage(){
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  //判断是否存在SD卡
			File file = new File(imgPath);
			if(!file.exists()){
				file.mkdir();
			}
		}else{
			new AlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")
				.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						finish();
					}
				}).show();
		}
	}
 protected void onActivityResult(int requestCode, int resultCode, Intent data)  {         
    		if (resultCode == TAKE_PICTURE)      {          
    			//  拍照Activity保存图像数据的key是data,返回的数据类型是Bitmap对象          
    			Bitmap cameraBitmap = (Bitmap) data.getExtras().get("/sdcard/rtest.jpg");         
				//  在ImageView组件中显示拍摄的照片         
    			image.setImageBitmap(cameraBitmap); 

                // 做自己的业务操作。。。。
    			}      
      super.onActivityResult(requestCode, resultCode, data);  
    		    } 
?
??? (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. ??}??
文章来源:https://blog.csdn.net/liujianminghero/article/details/7467583
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。