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. }
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. <?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>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <SurfaceView android:id="@+id/surface_camera" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:text="拍照" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/takepic" /> <Button android:text="退出" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/exit" /> </LinearLayout> </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. }
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. 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. }
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. <?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>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageSwitcher android:id="@+id/switcher" android:layout_width="match_parent" android:layout_height="match_parent" ></ImageSwitcher> <Gallery android:id="@+id/gallery" android:layout_width="match_parent" android:background="#55000000" android:layout_height="100dip" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:gravity="center_vertical" android:spacing="8dip" /> </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. }
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. 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. }
@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. 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. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于拍摄照片我们可以直接调用系统自带的相机拍照,一般情况下无需我们自己开发相机拍照。 1、当点击按钮后我们可以通过Intent意图启动系统相机 @Override public void onClick(View v) { Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String temName=new DateFormat().format("yyMMdd_hhmmss",System.currentTimeMillis())+"_"+(Math.random()*100)+".jpg"; //文件名 image_path=path+File.separator+temName; File file=new File(image_path); if(file.exists()){ file.delete(); } Uri u=Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, u); startActivityForResult(intent, 0); } 在这里设置 intent.putExtra(MediaStore.EXTRA_OUTPUT, u);非常重要,如果不设置这个参数那么我们获取到的图片只是一个经过压缩后的缩略图,只有设置这个才能得到拍摄后的原图。 2、在startActivityForResult(intent, 0);后我们需要重写onActivityResult(int requestCode, int resultCode, Intent data)方法,如果设置了MediaStore.EXTRA_OUTPUT那么我们在这里data返回的是null。 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode==RESULT_OK){ File file=new File(image_path); try { Uri uri = Uri.fromFile(file); BitmapFactory.Options options=new BitmapFactory.Options(); options.inJustDecodeBounds=true; BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); options.inSampleSize=4; options.inJustDecodeBounds=false; Bitmap map=BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), map, null, null); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri)); image.setImageBitmap(map); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 蓝色部分是对图片进行简单的压缩处理,如果不进行处理会出现内存溢出。 红色部分是将图片保存在DCIM文件夹下。 绿色部分是发生一个广播通知系统重新扫描制定文件,这样我们就可以在图库本地图片中看到拍摄的图片。 3、最后记得在清单文件中加入调用系统相机和保存文件权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值