`
baobaoupup
  • 浏览: 471584 次
文章分类
社区版块
存档分类
最新评论

Android拍照,上传,预览综合

 
阅读更多

第一步

1 try {
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. importjava.io.BufferedOutputStream;
  2. importjava.io.File;
  3. importjava.io.FileOutputStream;
  4. importjava.io.IOException;
  5. importandroid.app.Activity;
  6. importandroid.app.AlertDialog;
  7. importandroid.content.DialogInterface;
  8. importandroid.content.Intent;
  9. importandroid.graphics.Bitmap;
  10. importandroid.graphics.BitmapFactory;
  11. importandroid.graphics.PixelFormat;
  12. importandroid.hardware.Camera;
  13. importandroid.hardware.Camera.AutoFocusCallback;
  14. importandroid.hardware.Camera.PictureCallback;
  15. importandroid.hardware.Camera.ShutterCallback;
  16. importandroid.os.Bundle;
  17. importandroid.os.Environment;
  18. importandroid.util.Log;
  19. importandroid.view.KeyEvent;
  20. importandroid.view.SurfaceHolder;
  21. importandroid.view.SurfaceView;
  22. importandroid.view.View;
  23. importandroid.view.View.OnClickListener;
  24. importandroid.widget.Button;
  25. importcom.peacemap.photo.po.Const;
  26. /**
  27. *拍照
  28. *@authorAdministrator
  29. */
  30. publicclassTakePhotoActextendsActivityimplementsSurfaceHolder.Callback{
  31. privatestaticStringimgPath=Environment.getExternalStorageDirectory().getPath()+"/"+Const.imageDir;
  32. privateSurfaceViewsurfaceView;//相机画布
  33. privateSurfaceHoldersurfaceHolder;
  34. privateButtontakePicView,exitView;
  35. privateCameramCamera;//照相机
  36. @Override
  37. publicvoidonCreate(BundlesavedInstanceState){
  38. super.onCreate(savedInstanceState);
  39. setContentView(R.layout.main);
  40. //这里我在AndroidManifest.xml的activity中添加了android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
  41. /**
  42. *隐藏状态栏和标题栏
  43. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
  44. requestWindowFeature(Window.FEATURE_NO_TITLE);
  45. */
  46. //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
  47. /**
  48. *获取Button并且设置事件监听
  49. */
  50. takePicView=(Button)this.findViewById(R.id.takepic);
  51. takePicView.setOnClickListener(TakePicListener);
  52. exitView=(Button)this.findViewById(R.id.exit);
  53. exitView.setOnClickListener(newOnClickListener(){
  54. @Override
  55. publicvoidonClick(Viewv){
  56. finish();
  57. }
  58. });
  59. surfaceView=(SurfaceView)this.findViewById(R.id.surface_camera);
  60. surfaceHolder=surfaceView.getHolder();
  61. surfaceHolder.addCallback(this);
  62. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  63. checkSoftStage();//首先检测SD卡是否存在
  64. }
  65. /**
  66. *检测手机是否存在SD卡,网络连接是否打开
  67. */
  68. privatevoidcheckSoftStage(){
  69. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断是否存在SD卡
  70. //StringrootPath=Environment.getExternalStorageDirectory().getPath();//获取SD卡的根目录
  71. Filefile=newFile(imgPath);
  72. if(!file.exists()){
  73. file.mkdir();
  74. }
  75. }else{
  76. newAlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")
  77. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  78. @Override
  79. publicvoidonClick(DialogInterfacedialog,intwhich){
  80. finish();
  81. }
  82. }).show();
  83. }
  84. }
  85. /**
  86. *点击拍照按钮,启动拍照
  87. */
  88. privatefinalOnClickListenerTakePicListener=newOnClickListener(){
  89. @Override
  90. publicvoidonClick(Viewv){
  91. mCamera.autoFocus(newAutoFoucus());//自动对焦
  92. }
  93. };
  94. /**
  95. *自动对焦后拍照
  96. *@authoraokunsang
  97. *@Date2011-12-5
  98. */
  99. privatefinalclassAutoFoucusimplementsAutoFocusCallback{
  100. @Override
  101. publicvoidonAutoFocus(booleansuccess,Cameracamera){
  102. if(success&&mCamera!=null){
  103. mCamera.takePicture(mShutterCallback,null,mPictureCallback);
  104. }
  105. }
  106. }
  107. /**
  108. *重点对象、此处实例化了一个本界面的PictureCallback
  109. *当用户拍完一张照片的时候触发,这时候对图片处理并保存操作。
  110. *
  111. */
  112. privatefinalPictureCallbackmPictureCallback=newPictureCallback(){
  113. @Override
  114. publicvoidonPictureTaken(byte[]data,Cameracamera){
  115. try{
  116. StringfileName=System.currentTimeMillis()+".jpg";
  117. Filefile=newFile(imgPath,fileName);
  118. Bitmapbm=BitmapFactory.decodeByteArray(data,0,data.length);
  119. BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(file));
  120. bm.compress(Bitmap.CompressFormat.JPEG,60,bos);
  121. bos.flush();
  122. bos.close();
  123. Intentintent=newIntent(TakePhotoAct.this,PictureViewAct.class);
  124. intent.putExtra("imagePath",file.getPath());
  125. startActivity(intent);
  126. }catch(Exceptione){
  127. e.printStackTrace();
  128. }
  129. }
  130. };
  131. /**
  132. *在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
  133. *普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作,例如:使设备震动
  134. */
  135. privatefinalShutterCallbackmShutterCallback=newShutterCallback(){
  136. publicvoidonShutter(){
  137. Log.d("ShutterCallback","...onShutter...");
  138. }
  139. };
  140. @Override
  141. /**
  142. *初始化相机参数,比如相机的参数:像素,大小,格式
  143. */
  144. publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
  145. intheight){
  146. Camera.Parametersparam=mCamera.getParameters();
  147. /**
  148. *设置拍照图片格式
  149. */
  150. param.setPictureFormat(PixelFormat.JPEG);
  151. /**
  152. *设置预览尺寸【这里需要注意:预览尺寸有些数字正确,有些会报错,不清楚为啥】
  153. */
  154. //param.setPreviewSize(320,240);
  155. /**
  156. *设置图片大小
  157. */
  158. param.setPictureSize(Const.width,Const.height);
  159. mCamera.setParameters(param);
  160. /**
  161. *开始预览
  162. */
  163. mCamera.startPreview();
  164. }
  165. @Override
  166. /**
  167. *打开相机,设置预览
  168. */
  169. publicvoidsurfaceCreated(SurfaceHolderholder){
  170. try{
  171. mCamera=Camera.open();//打开摄像头
  172. mCamera.setPreviewDisplay(holder);
  173. }catch(IOExceptione){
  174. mCamera.release();
  175. mCamera=null;
  176. }
  177. }
  178. @Override
  179. /**
  180. *预览界面被关闭时,或者停止相机拍摄;释放相机资源
  181. */
  182. publicvoidsurfaceDestroyed(SurfaceHolderholder){
  183. mCamera.stopPreview();
  184. if(mCamera!=null)mCamera.release();
  185. mCamera=null;
  186. }
  187. @Override
  188. publicbooleanonKeyDown(intkeyCode,KeyEventevent){
  189. if(keyCode==KeyEvent.KEYCODE_CAMERA){//按下相机实体按键,启动本程序照相功能
  190. mCamera.autoFocus(newAutoFoucus());//自动对焦
  191. returntrue;
  192. }else{
  193. returnfalse;
  194. }
  195. }
  196. }
xml:
Xml代码 复制代码收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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. <Button
  18. android:text="拍照"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:id="@+id/takepic"
  22. />
  23. <Button
  24. android:text="退出"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:id="@+id/exit"
  28. />
  29. </LinearLayout>
  30. </LinearLayout>
预览功能:
Java代码 复制代码收藏代码
  1. importjava.io.File;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.app.AlertDialog;
  6. importandroid.content.ComponentName;
  7. importandroid.content.DialogInterface;
  8. importandroid.content.Intent;
  9. importandroid.graphics.Bitmap;
  10. importandroid.graphics.BitmapFactory;
  11. importandroid.graphics.drawable.BitmapDrawable;
  12. importandroid.os.Bundle;
  13. importandroid.os.Environment;
  14. importandroid.util.Log;
  15. importandroid.view.Menu;
  16. importandroid.view.MenuItem;
  17. importandroid.view.MotionEvent;
  18. importandroid.view.View;
  19. importandroid.view.View.OnTouchListener;
  20. importandroid.view.animation.AnimationUtils;
  21. importandroid.widget.AdapterView;
  22. importandroid.widget.Gallery;
  23. importandroid.widget.ImageSwitcher;
  24. importandroid.widget.ImageView;
  25. importandroid.widget.LinearLayout.LayoutParams;
  26. importandroid.widget.ViewSwitcher.ViewFactory;
  27. importcom.peacemap.photo.adapter.ImageAdapter;
  28. importcom.peacemap.photo.po.Const;
  29. /**
  30. *图片浏览
  31. *@authoraokunsang
  32. *@Date2011-12-6
  33. */
  34. publicclassPhotoScanActextendsActivityimplementsViewFactory{
  35. privatestaticStringimgPath=Environment.getExternalStorageDirectory().getPath()+"/"+Const.imageDir;
  36. privateImageSwitcherimageSwitcher;
  37. privateGallerygallery;
  38. privateList<String>photoList;
  39. privateintdownX,upX;
  40. privateStringnewFilePath;
  41. @Override
  42. protectedvoidonCreate(BundlesavedInstanceState){
  43. super.onCreate(savedInstanceState);
  44. setContentView(R.layout.photoscan);
  45. photoList=readFileList();
  46. imageSwitcher=(ImageSwitcher)findViewById(R.id.switcher);
  47. imageSwitcher.setFactory(this);
  48. /*
  49. *淡入淡出效果
  50. */
  51. imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
  52. android.R.anim.fade_in));
  53. imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
  54. android.R.anim.fade_out));
  55. imageSwitcher.setOnTouchListener(touchListener);
  56. gallery=(Gallery)findViewById(R.id.gallery);
  57. gallery.setAdapter(newImageAdapter(this,photoList));
  58. gallery.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){
  59. @Override
  60. publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,
  61. intposition,longwhen){
  62. newFilePath=photoList.get(position);
  63. Bitmapbm=BitmapFactory.decodeFile(photoList.get(position));
  64. BitmapDrawablebd=newBitmapDrawable(bm);
  65. imageSwitcher.setImageDrawable(bd);
  66. }
  67. @Override
  68. publicvoidonNothingSelected(AdapterView<?>arg0){}
  69. });
  70. }
  71. /**
  72. *注册一个触摸事件
  73. */
  74. privateOnTouchListenertouchListener=newView.OnTouchListener(){
  75. @Override
  76. publicbooleanonTouch(Viewv,MotionEventevent){
  77. if(event.getAction()==MotionEvent.ACTION_DOWN)
  78. {
  79. downX=(int)event.getX();//取得按下时的坐标
  80. returntrue;
  81. }
  82. elseif(event.getAction()==MotionEvent.ACTION_UP)
  83. {
  84. upX=(int)event.getX();//取得松开时的坐标
  85. intindex=0;
  86. if(upX-downX>100)//从左拖到右,即看前一张
  87. {
  88. //如果是第一,则去到尾部
  89. if(gallery.getSelectedItemPosition()==0)
  90. index=gallery.getCount()-1;
  91. else
  92. index=gallery.getSelectedItemPosition()-1;
  93. }
  94. elseif(downX-upX>100)//从右拖到左,即看后一张
  95. {
  96. //如果是最后,则去到第一
  97. if(gallery.getSelectedItemPosition()==(gallery.getCount()-1))
  98. index=0;
  99. else
  100. index=gallery.getSelectedItemPosition()+1;
  101. }
  102. //改变gallery图片所选,自动触发ImageSwitcher的setOnItemSelectedListener
  103. gallery.setSelection(index,true);
  104. returntrue;
  105. }
  106. returnfalse;
  107. }
  108. };
  109. /**
  110. *获取SD卡中的所有图片路径
  111. *@return
  112. */
  113. privateList<String>readFileList(){
  114. List<String>fileList=newArrayList<String>();
  115. FilefileDir=newFile(imgPath);
  116. File[]files=fileDir.listFiles();
  117. if(files!=null){
  118. for(Filefile:files){
  119. StringfileName=file.getName();
  120. if(fileName.lastIndexOf(".")>0
  121. &&fileName.substring(fileName.lastIndexOf(".")+1,
  122. fileName.length()).equals("jpg")){
  123. fileList.add(file.getPath());
  124. }
  125. }
  126. }
  127. returnfileList;
  128. }
  129. @Override
  130. publicViewmakeView(){
  131. ImageViewimageView=newImageView(this);
  132. imageView.setScaleType(ImageView.ScaleType.CENTER);
  133. imageView.setLayoutParams(newImageSwitcher.LayoutParams(//自适应图片大小
  134. LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
  135. returnimageView;
  136. }
  137. //声明2个menu键按钮
  138. publicfinalstaticintITEM_1_ID=Menu.FIRST;
  139. publicfinalstaticintITEM_2_ID=Menu.FIRST+1;
  140. @Override
  141. publicbooleanonCreateOptionsMenu(Menumenu){
  142. super.onCreateOptionsMenu(menu);
  143. menu.add(0,ITEM_1_ID,0,"我要上传");
  144. menu.add(0,ITEM_2_ID,1,"我要拍照");
  145. returntrue;
  146. }
  147. @Override
  148. publicbooleanonOptionsItemSelected(MenuItemitem){
  149. super.onOptionsItemSelected(item);
  150. switch(item.getItemId()){
  151. case1:{//调出系统设置界面
  152. Intentintent=newIntent(PhotoScanAct.this,PictureViewAct.class);
  153. intent.putExtra("imagePath",newFilePath);
  154. startActivity(intent);
  155. break;
  156. }
  157. case2:{//拍照
  158. startActivity(newIntent(this,TakePhotoAct.class));
  159. break;
  160. }
  161. }
  162. returntrue;
  163. }
  164. }
ImageAdapter适配器:
Java代码 复制代码收藏代码
  1. importjava.util.List;
  2. importandroid.content.Context;
  3. importandroid.graphics.Bitmap;
  4. importandroid.graphics.BitmapFactory;
  5. importandroid.view.View;
  6. importandroid.view.ViewGroup;
  7. importandroid.widget.BaseAdapter;
  8. importandroid.widget.Gallery;
  9. importandroid.widget.ImageView;
  10. /**
  11. *图片适配器
  12. *@authoraokunsang
  13. *@Date2011-12-6
  14. */
  15. publicclassImageAdapterextendsBaseAdapter{
  16. privateList<String>picList;
  17. privateContextmContext;
  18. publicImageAdapter(ContextmContext,List<String>picList){
  19. this.mContext=mContext;
  20. this.picList=picList;
  21. }
  22. @Override
  23. publicintgetCount(){
  24. returnpicList.size();
  25. }
  26. /*(non-Javadoc)
  27. *@seeandroid.widget.Adapter#getItem(int)
  28. */
  29. @Override
  30. publicObjectgetItem(intposition){
  31. //TODOAuto-generatedmethodstub
  32. returnpicList.get(position);
  33. }
  34. /*(non-Javadoc)
  35. *@seeandroid.widget.Adapter#getItemId(int)
  36. */
  37. @Override
  38. publiclonggetItemId(intposition){
  39. //TODOAuto-generatedmethodstub
  40. returnposition;
  41. }
  42. @Override
  43. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  44. ImageViewimage=newImageView(mContext);
  45. Bitmapbm=BitmapFactory.decodeFile(picList.get(position));
  46. image.setImageBitmap(bm);
  47. image.setScaleType(ImageView.ScaleType.CENTER_CROP);
  48. image.setLayoutParams(newGallery.LayoutParams(100,100));
  49. returnimage;
  50. }
  51. }
xml:
Xml代码 复制代码收藏代码
  1. <?xmlversion="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. <ImageSwitcher
  7. android:id="@+id/switcher"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. ></ImageSwitcher>
  11. <Gallery
  12. android:id="@+id/gallery"
  13. android:layout_width="match_parent"
  14. android:background="#55000000"
  15. android:layout_height="100dip"
  16. android:layout_alignParentBottom="true"
  17. android:layout_alignParentLeft="true"
  18. android:gravity="center_vertical"
  19. android:spacing="8dip"
  20. />
  21. </RelativeLayout>
上传工具类:
Java代码 复制代码收藏代码
  1. importjava.io.BufferedReader;
  2. importjava.io.DataOutputStream;
  3. importjava.io.FileInputStream;
  4. importjava.io.InputStream;
  5. importjava.io.InputStreamReader;
  6. importjava.net.HttpURLConnection;
  7. importjava.net.URL;
  8. importjava.util.Map;
  9. importjava.util.Map.Entry;
  10. importandroid.util.Log;
  11. importcom.peacemap.photo.po.FileInfo;
  12. /**
  13. *POST上传文件
  14. *@authoraokunsang
  15. *@Date2011-12-6
  16. */
  17. publicclassPostFile{
  18. privatestaticPostFilepostFile=newPostFile();
  19. privatefinalstaticStringLINEND="\r\n";
  20. privatefinalstaticStringBOUNDARY="---------------------------7da2137580612";//数据分隔线
  21. privatefinalstaticStringPREFIX="--";
  22. privatefinalstaticStringMUTIPART_FORMDATA="multipart/form-data";
  23. privatefinalstaticStringCHARSET="utf-8";
  24. privatefinalstaticStringCONTENTTYPE="application/octet-stream";
  25. privatePostFile(){}
  26. publicstaticPostFilegetInstance(){
  27. returnpostFile;
  28. }
  29. /**
  30. *HTTP上传文件
  31. *@paramactionUrl请求服务器的路径
  32. *@paramparams传递的表单内容
  33. *@paramfiles多个文件信息
  34. *@return
  35. */
  36. publicStringpost(StringactionUrl,Map<String,String>params,FileInfo[]files){
  37. try{
  38. URLurl=newURL(actionUrl);
  39. HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
  40. urlConn.setDoOutput(true);//允许输出
  41. urlConn.setDoInput(true);//允许输入
  42. urlConn.setUseCaches(false);
  43. urlConn.setRequestMethod("POST");
  44. urlConn.setRequestProperty("connection","Keep-Alive");
  45. urlConn.setRequestProperty("Charset",CHARSET);
  46. urlConn.setRequestProperty("Content-Type",MUTIPART_FORMDATA+";boundary="+BOUNDARY);
  47. DataOutputStreamdos=newDataOutputStream(urlConn.getOutputStream());
  48. //构建表单数据
  49. StringentryText=bulidFormText(params);
  50. Log.i("-------描述信息---------------",entryText);
  51. dos.write(entryText.getBytes());
  52. StringBuffersb=newStringBuffer("");
  53. for(FileInfofile:files){
  54. sb.append(PREFIX).append(BOUNDARY).append(LINEND);
  55. sb.append("Content-Disposition:form-data;name=\""+file.getFileTextName()+"\";filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);
  56. sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);
  57. sb.append(LINEND);
  58. dos.write(sb.toString().getBytes());
  59. InputStreamis=newFileInputStream(file.getFile());
  60. byte[]buffer=newbyte[1024];
  61. intlen=0;
  62. while((len=is.read(buffer))!=-1){
  63. dos.write(buffer,0,len);
  64. }
  65. is.close();
  66. dos.write(LINEND.getBytes());
  67. }
  68. //请求的结束标志
  69. byte[]end_data=(PREFIX+BOUNDARY+PREFIX+LINEND).getBytes();
  70. dos.write(end_data);
  71. dos.flush();
  72. //-----------------------------------发送请求数据结束----------------------------
  73. //----------------------------------接收返回信息------------------------
  74. intcode=urlConn.getResponseCode();
  75. if(code!=200){
  76. urlConn.disconnect();
  77. return"";
  78. }else{
  79. BufferedReaderbr=newBufferedReader(newInputStreamReader(urlConn.getInputStream()));
  80. Stringresult="";
  81. Stringline=null;
  82. while((line=br.readLine())!=null){
  83. result+=line;
  84. }
  85. br.close();
  86. urlConn.disconnect();
  87. returnresult;
  88. }
  89. }catch(Exceptione){
  90. Log.e("--------上传图片错误--------",e.getMessage());
  91. returnnull;
  92. }
  93. }
  94. /**
  95. *HTTP上传单个文件
  96. *@paramactionUrl请求服务器的路径
  97. *@paramparams传递的表单内容
  98. *@paramfiles单个文件信息
  99. *@return
  100. */
  101. publicStringpost(StringactionUrl,Map<String,String>params,FileInfofileInfo){
  102. returnpost(actionUrl,params,newFileInfo[]{fileInfo});
  103. }
  104. /**
  105. *封装表单文本数据
  106. *@paramparamText
  107. *@return
  108. */
  109. privateStringbulidFormText(Map<String,String>paramText){
  110. if(paramText==null||paramText.isEmpty())return"";
  111. StringBuffersb=newStringBuffer("");
  112. for(Entry<String,String>entry:paramText.entrySet()){
  113. sb.append(PREFIX).append(BOUNDARY).append(LINEND);
  114. sb.append("Content-Disposition:form-data;name=\""
  115. +entry.getKey()+"\""+LINEND);
  116. //sb.append("Content-Type:text/plain;charset="+CHARSET+LINEND);
  117. sb.append(LINEND);
  118. sb.append(entry.getValue());
  119. sb.append(LINEND);
  120. }
  121. returnsb.toString();
  122. }
  123. /**
  124. *封装文件文本数据
  125. *@paramfiles
  126. *@return
  127. */
  128. privateStringbuildFromFile(FileInfo[]files){
  129. StringBuffersb=newStringBuffer();
  130. for(FileInfofile:files){
  131. sb.append(PREFIX).append(BOUNDARY).append(LINEND);
  132. sb.append("Content-Disposition:form-data;name=\""+file.getFileTextName()+"\";filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);
  133. sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);
  134. sb.append(LINEND);
  135. }
  136. returnsb.toString();
  137. }
  138. }

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

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

相关推荐

Global site tag (gtag.js) - Google Analytics