久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Android拍照,,上傳,預(yù)覽綜合【修改】

 旭龍 2012-10-09

轉(zhuǎn)載自 http://aokunsang./blog/1295813


最近需要做手機(jī)拍照【兩種方式:調(diào)用系統(tǒng)相機(jī)(博客最后);自己寫照相機(jī)布局】,,預(yù)覽,,上傳功能。特地研究了下android的手機(jī)拍照,。

參考地址:

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

http://mjbb./blog/1018006

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


1,、上傳文件功能網(wǎng)上很多講的,只要細(xì)心點(diǎn),,按照格式來寫發(fā)送的數(shù)據(jù),,都是沒有問題的。如果遇到問題,,歡迎留言討論,、

2、預(yù)覽使用Gallery和ImageSwitcher就行,,我做的很簡(jiǎn)單(參考代碼),。

----------------------------------------------------------------------------------------------------------------------

修改內(nèi)容

          1、照相功能使用系統(tǒng)自帶照相機(jī)(自己寫的照相機(jī)屬性設(shè)置根據(jù)不同照相機(jī)會(huì)有問題,,所以舍棄)

          2、預(yù)覽功能不再使用Gallery+ImageSwitcher;實(shí)用性不強(qiáng),,并且顯示慢且卡。改用異步加載

          3、上傳圖片時(shí),,對(duì)圖片進(jìn)行壓縮,,增加上傳速度。

          4,、長(zhǎng)按gridView進(jìn)入編輯模式,批量刪除圖片,。參考http://aokunsang./blog/1668902

  以此,,希望能做到最好的用戶體驗(yàn)。


附上流程圖:


 
拍照功能:【預(yù)覽尺寸有知道的朋友留言告知,?!?/span>
Java代碼  收藏代碼
  1. * 拍照  
  2. @author Administrator  
  3. */  
  4. ublic class TakePhotoAct extends Activity implements SurfaceHolder.Callback{  
  5.   
  6. private static String imgPath = Environment.getExternalStorageDirectory().getPath() + "/"+Const.imageDir;  
  7.   
  8. private SurfaceView surfaceView;   //相機(jī)畫布  
  9. private SurfaceHolder surfaceHolder;   
  10. private Button takePicView,exitView;  
  11.   
  12. private Camera mCamera;    //照相機(jī)  
  13.   
  14. @Override  
  15.    public void onCreate(Bundle savedInstanceState) {  
  16.       
  17.        super.onCreate(savedInstanceState);  
  18.        setContentView(R.layout.main);  
  19. /這里我在AndroidManifest.xml的activity中添加了android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  
  20.   
  21.        /** 
  22.         * 隱藏狀態(tài)欄和標(biāo)題欄 
  23.          
  24.        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  25.        requestWindowFeature(Window.FEATURE_NO_TITLE); 
  26.        */  
  27.        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //橫屏  
  28.        /** 
  29.         * 獲取Button并且設(shè)置事件監(jiān)聽 
  30.         */  
  31.        takePicView = (Button)this.findViewById(R.id.takepic);  
  32.        takePicView.setOnClickListener(TakePicListener);  
  33.        exitView = (Button)this.findViewById(R.id.exit);  
  34.        exitView.setOnClickListener(new OnClickListener() {  
  35.         @Override  
  36.         public void onClick(View v) {  
  37.             finish();  
  38.         }  
  39.     });  
  40.        surfaceView = (SurfaceView)this.findViewById(R.id.surface_camera);  
  41.        surfaceHolder = surfaceView.getHolder();  
  42.        surfaceHolder.addCallback(this);  
  43.        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  44.          
  45.        checkSoftStage();  //首先檢測(cè)SD卡是否存在  
  46.    }  
  47.   
  48. /** 
  49.  * 檢測(cè)手機(jī)是否存在SD卡,網(wǎng)絡(luò)連接是否打開 
  50.  */  
  51. private void checkSoftStage(){  
  52.     if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  //判斷是否存在SD卡  
  53. /           String rootPath = Environment.getExternalStorageDirectory().getPath();  //獲取SD卡的根目錄  
  54.         File file = new File(imgPath);  
  55.         if(!file.exists()){  
  56.             file.mkdir();  
  57.         }  
  58.     }else{  
  59.         new AlertDialog.Builder(this).setMessage("檢測(cè)到手機(jī)沒有存儲(chǔ)卡,!請(qǐng)插入手機(jī)存儲(chǔ)卡再開啟本應(yīng)用。")  
  60.             .setPositiveButton("確定"new DialogInterface.OnClickListener() {  
  61.                 @Override  
  62.                 public void onClick(DialogInterface dialog, int which) {  
  63.                     finish();  
  64.                 }  
  65.             }).show();  
  66.     }  
  67. }  
  68.   
  69. /** 
  70.  * 點(diǎn)擊拍照按鈕,啟動(dòng)拍照 
  71.  */  
  72. private final OnClickListener TakePicListener = new OnClickListener(){  
  73.     @Override  
  74.     public void onClick(View v) {  
  75.         mCamera.autoFocus(new AutoFoucus());  //自動(dòng)對(duì)焦  
  76.     }  
  77. };  
  78.   
  79. /** 
  80.  * 自動(dòng)對(duì)焦后拍照 
  81.  * @author aokunsang 
  82.  * @Date 2011-12-5 
  83.  */  
  84. private final class AutoFoucus implements AutoFocusCallback{  
  85.     @Override  
  86.     public void onAutoFocus(boolean success, Camera camera) {  
  87.         if(success && mCamera!=null){  
  88.             mCamera.takePicture(mShutterCallback, null, mPictureCallback);  
  89.         }  
  90.     }  
  91. }  
  92. /** 
  93.  * 重點(diǎn)對(duì)象,、 此處實(shí)例化了一個(gè)本界面的PictureCallback 
  94.  * 當(dāng)用戶拍完一張照片的時(shí)候觸發(fā),,這時(shí)候?qū)D片處理并保存操作。 
  95.  *  
  96.  */  
  97. private final PictureCallback mPictureCallback = new PictureCallback() {  
  98.     @Override  
  99.     public void onPictureTaken(byte[] data, Camera camera) {  
  100.         try {  
  101.             String fileName = System.currentTimeMillis()+".jpg";  
  102.             File file = new File(imgPath,fileName);  
  103.             Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);  
  104.             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));  
  105.             bm.compress(Bitmap.CompressFormat.JPEG, 60, bos);  
  106.             bos.flush();  
  107.             bos.close();  
  108.               
  109.             Intent intent = new Intent(TakePhotoAct.this,PictureViewAct.class);  
  110.             intent.putExtra("imagePath", file.getPath());  
  111.             startActivity(intent);  
  112.         } catch (Exception e) {  
  113.             e.printStackTrace();  
  114.         }  
  115.     }  
  116. };  
  117. /**  
  118. * 在相機(jī)快門關(guān)閉時(shí)候的回調(diào)接口,,通過這個(gè)接口來通知用戶快門關(guān)閉的事件,,  
  119. * 普通相機(jī)在快門關(guān)閉的時(shí)候都會(huì)發(fā)出響聲,根據(jù)需要可以在該回調(diào)接口中定義各種動(dòng)作,, 例如:使設(shè)備震動(dòng)  
  120. */    
  121. private final ShutterCallback mShutterCallback = new ShutterCallback() {    
  122.     public void onShutter() {    
  123.         Log.d("ShutterCallback""...onShutter...");    
  124.     }    
  125. };  
  126.   
  127. @Override  
  128. /** 
  129.  * 初始化相機(jī)參數(shù),,比如相機(jī)的參數(shù): 像素, 大小,格式 
  130.  */  
  131. public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  132.         int height) {  
  133.     Camera.Parameters param = mCamera.getParameters();  
  134.     /** 
  135.      * 設(shè)置拍照?qǐng)D片格式 
  136.      */  
  137.     param.setPictureFormat(PixelFormat.JPEG);  
  138.     /** 
  139.      * 設(shè)置預(yù)覽尺寸【這里需要注意:預(yù)覽尺寸有些數(shù)字正確,有些會(huì)報(bào)錯(cuò),,不清楚為啥】 
  140.      */  
  141.     //param.setPreviewSize(320, 240);  
  142.     /** 
  143.      * 設(shè)置圖片大小 
  144.      */  
  145.     param.setPictureSize(Const.width, Const.height);  
  146.     mCamera.setParameters(param);  
  147.     /** 
  148.      * 開始預(yù)覽 
  149.      */  
  150.     mCamera.startPreview();  
  151. }  
  152. @Override  
  153. /** 
  154.  * 打開相機(jī),設(shè)置預(yù)覽 
  155.  */  
  156. public void surfaceCreated(SurfaceHolder holder) {  
  157.     try {  
  158.         mCamera = Camera.open();  //打開攝像頭  
  159.         mCamera.setPreviewDisplay(holder);  
  160.     } catch (IOException e) {  
  161.         mCamera.release();  
  162.         mCamera = null;  
  163.     }  
  164. }  
  165.   
  166. @Override  
  167. /** 
  168.  * 預(yù)覽界面被關(guān)閉時(shí),,或者停止相機(jī)拍攝;釋放相機(jī)資源 
  169.  */  
  170. public void surfaceDestroyed(SurfaceHolder holder) {  
  171.     mCamera.stopPreview();  
  172.     if(mCamera!=null) mCamera.release();  
  173.     mCamera = null;  
  174. }  
  175.   
  176. @Override  
  177. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  178.     if(keyCode == KeyEvent.KEYCODE_CAMERA){   //按下相機(jī)實(shí)體按鍵,啟動(dòng)本程序照相功能  
  179.         mCamera.autoFocus(new AutoFoucus());  //自動(dòng)對(duì)焦  
  180.         return true;  
  181.     }else{  
  182.         return false;  
  183.     }  
  184. }  
  xml:
Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas./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>  
 預(yù)覽功能:
 /**
Java代碼  收藏代碼
  1.  * 圖片預(yù)覽  
  2.  * @author: aokunsang  
  3.  * @date: 2012-8-1  
  4.  */  
  5. public class PictureScanAct extends Activity {  
  6.   
  7.     private GridView gridView;  
  8.     private ImageAdapter imgAdapter;  
  9.     private List<String> fileNameList = new ArrayList<String>();  
  10.       
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.           
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.picturescan);  
  16.           
  17.         gridView = (GridView)findViewById(R.id.picture_grid);  
  18.         imgAdapter = new ImageAdapter(this);  
  19.         gridView.setAdapter(imgAdapter);  
  20.         gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  21.             @Override  
  22.             public void onItemClick(AdapterView<?> parent, View view,  
  23.                     int position, long id) {  
  24.                 String fileName = fileNameList.get(position);  
  25.                 startActivity(new Intent(PictureScanAct.this, PictureViewAct.class).putExtra("flag","upload").putExtra("imagePath",fileName));  
  26.             }  
  27.         });  
  28.         //setProgressBarIndeterminateVisibility(true);  
  29.         Toast.makeText(this"加載圖片中....", Toast.LENGTH_LONG).show();  
  30.         new AsyncLoadedImage().execute();  
  31.     }  
  32.     /** 
  33.      * 向適配器添加圖片 
  34.      * @param bitmap 
  35.      */  
  36.     private void addImage(Bitmap... loadImages){  
  37.         for(Bitmap loadImage:loadImages){  
  38.             imgAdapter.addPhoto(loadImage);  
  39.         }  
  40.     }  
  41.     /** 
  42.      * 釋放內(nèi)存 
  43.      */  
  44.     protected void onDestroy() {  
  45.         super.onDestroy();  
  46.         final GridView grid = gridView;  
  47.         final int count = grid.getChildCount();  
  48.         ImageView v = null;  
  49.         for (int i = 0; i < count; i++) {  
  50.             v = (ImageView) grid.getChildAt(i);  
  51.             ((BitmapDrawable) v.getDrawable()).setCallback(null);  
  52.         }  
  53.     }  
  54.     /** 
  55.      * 異步加載圖片展示 
  56.      * @author: aokunsang 
  57.      * @date: 2012-8-1 
  58.      */  
  59.      class AsyncLoadedImage extends AsyncTask<Object, Bitmap, Boolean> {  
  60.   
  61.         @Override  
  62.         protected Boolean doInBackground(Object... params) {  
  63.             File fileDir = new File(Const.imgPath);  
  64.             File[] files = fileDir.listFiles();  
  65.             boolean result = false;  
  66.             if(files!=null){  
  67.                 for(File file:files){  
  68.                     String fileName = file.getName();  
  69.                     if (fileName.lastIndexOf(".") > 0    
  70.                             && fileName.substring(fileName.lastIndexOf(".") + 1,    
  71.                             fileName.length()).equals("jpg")){  
  72.                         Bitmap bitmap;  
  73.                         Bitmap newBitmap;  
  74.                          try {  
  75.                             BitmapFactory.Options options = new BitmapFactory.Options();  
  76.                             options.inSampleSize = 10;  
  77.                             bitmap = BitmapFactory.decodeFile(file.getPath(), options);  
  78.                             newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 100100);  
  79.                             bitmap.recycle();  
  80.                             if (newBitmap != null) {  
  81.                                 fileNameList.add(file.getPath());  
  82.                                 publishProgress(newBitmap);  
  83.                                 result = true;  
  84.                             }  
  85.                         } catch (Exception e) {  
  86.                             e.printStackTrace();  
  87.                         }  
  88.                     }  
  89.                 }  
  90.             }  
  91.             return result;  
  92.         }  
  93.         @Override  
  94.         public void onProgressUpdate(Bitmap... value) {  
  95.             addImage(value);  
  96.         }  
  97.         @Override  
  98.         protected void onPostExecute(Boolean result) {  
  99.             if(!result){  
  100.                 showDialog(1);  
  101.             }  
  102.         }  
  103.      }  
  104.      @Override  
  105.     protected Dialog onCreateDialog(int id) {  
  106.          AlertDialog dialog = new AlertDialog.Builder(PictureScanAct.this).setTitle("溫馨提示").setMessage("暫時(shí)還沒有照片,請(qǐng)先采集照片,!")  
  107.             .setPositiveButton("確定"new DialogInterface.OnClickListener(){  
  108.                 @Override  
  109.                 public void onClick(DialogInterface dialog, int which) {  
  110.                     startActivity(new Intent(PictureScanAct.this,TakePhotoAct.class));  
  111.                 }  
  112.             }).setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  113.                 @Override  
  114.                 public void onClick(DialogInterface dialog, int which) {  
  115.                     finish();  
  116.                 }  
  117.             }).show();  
  118.          return dialog;  
  119.     }  
  120. }  
 
   GridView適配器:
     public class ImageAdapter extends BaseAdapter {
Java代碼  收藏代碼
  1. private List<Bitmap> picList = new ArrayList<Bitmap>();  
  2. private Context mContext;  
  3. public ImageAdapter(Context mContext){  
  4.     this.mContext = mContext;  
  5. }  
  6.   
  7. @Override  
  8. public int getCount() {  
  9.     return picList.size();  
  10. }  
  11.   
  12. /* (non-Javadoc) 
  13.  * @see android.widget.Adapter#getItem(int) 
  14.  */  
  15. @Override  
  16. public Object getItem(int position) {  
  17.     // TODO Auto-generated method stub  
  18.     return picList.get(position);  
  19. }  
  20. /** 
  21.  * 添加圖片 
  22.  * @param bitmap 
  23.  */  
  24. public void addPhoto(Bitmap loadImage){  
  25.     picList.add(loadImage);  
  26.     notifyDataSetChanged();  
  27. }  
  28.   
  29. /* (non-Javadoc) 
  30.  * @see android.widget.Adapter#getItemId(int) 
  31.  */  
  32. @Override  
  33. public long getItemId(int position) {  
  34.     // TODO Auto-generated method stub  
  35.     return position;  
  36. }  
  37.   
  38. @Override  
  39. public View getView(int position, View convertView, ViewGroup parent) {  
  40.     ImageView imageView = null;  
  41.     if(convertView == null){  
  42.         imageView = new ImageView(mContext);  
  43.         imageView.setLayoutParams(new GridView.LayoutParams(110110));    
  44.         imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);    
  45.         imageView.setPadding(5,5,5,5);  
  46.     }else{  
  47.         imageView = (ImageView)convertView;  
  48.     }  
  49.     imageView.setImageBitmap(picList.get(position));  
  50.     return imageView;  
  51. }  
 
   圖片預(yù)覽界面:
  
     <?xml version="1.0" encoding="utf-8"?>
Xml代碼  收藏代碼
  1. <GridView xmlns:android="http://schemas./apk/res/android"  
  2.     android:id="@+id/picture_grid"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"   
  5.     android:numColumns="4"  
  6.     android:verticalSpacing="5dip"  
  7.     android:horizontalSpacing="5dip"  
  8.     android:stretchMode="columnWidth"  
  9.     android:columnWidth="120dip"  
  10.     android:gravity="center"      
  11.     >  
  12. </GridView>  
 
   
   預(yù)覽圖片:
   



   

   上傳工具類:
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"//數(shù)據(jù)分隔線  
  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  請(qǐng)求服務(wù)器的路徑 
  39.      * @param params     傳遞的表單內(nèi)容 
  40.      * @param files      多個(gè)文件信息 
  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.             //構(gòu)建表單數(shù)據(jù)  
  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.             //請(qǐng)求的結(jié)束標(biāo)志  
  80.             byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();  
  81.             dos.write(end_data);  
  82.             dos.flush();  
  83.     //-----------------------------------  發(fā)送請(qǐng)求數(shù)據(jù)結(jié)束  ----------------------------  
  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("--------上傳圖片錯(cuò)誤--------", e.getMessage());  
  104.             return null;  
  105.         }  
  106.     }  
  107.       
  108.     /** 
  109.      * HTTP上傳單個(gè)文件 
  110.      * @param actionUrl  請(qǐng)求服務(wù)器的路徑 
  111.      * @param params     傳遞的表單內(nèi)容 
  112.      * @param files      單個(gè)文件信息 
  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.      * 封裝表單文本數(shù)據(jù) 
  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.      * 封裝文件文本數(shù)據(jù) 
  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. }  
    上傳圖片時(shí)對(duì)圖片進(jìn)行壓縮處理(壓縮處理程序):
   /**
Java代碼  收藏代碼
  1.      * 壓縮圖片上傳  
  2.      * @param picPath  
  3.      * @return  
  4.      */  
  5.     private synchronized File compressPicture(String picPath){  
  6.           
  7.            String fileName = picPath.substring(picPath.lastIndexOf("/"));  
  8.           
  9.             Bitmap bitmap = BitmapFactory.decodeFile(picPath);  
  10.             //獲取這個(gè)圖片的寬和高     
  11.             int width = bitmap.getWidth();     
  12.             int height = bitmap.getHeight();     
  13.         
  14.             //設(shè)置上傳時(shí)候,,圖片的寬度和高度     
  15.             int newWidth = 640;     
  16.             int newHeight = 480;     
  17.         
  18.             //計(jì)算縮放率,新尺寸除原始尺寸     
  19.             float scaleWidth = ((float) newWidth) / width;     
  20.             float scaleHeight = ((float) newHeight) / height;     
  21.         
  22.             // 創(chuàng)建操作圖片用的matrix對(duì)象     
  23.             Matrix matrix = new Matrix();     
  24.             // 縮放圖片動(dòng)作     
  25.             matrix.postScale(scaleWidth, scaleHeight);     
  26.             //旋轉(zhuǎn)圖片 動(dòng)作     
  27.             //matrix.postRotate(45);     
  28.         
  29.             // 創(chuàng)建新的圖片     
  30.             Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 00,     
  31.                               width, height, matrix, true);     
  32.              
  33.            //保存入sdCard    
  34.            File file = new File(Const.thumbnailPath+fileName);    
  35.            try {    
  36.             FileOutputStream out = new FileOutputStream(file);    
  37.             if(resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)){    
  38.                 out.flush();    
  39.                 out.close();    
  40.             }  
  41.         } catch (Exception e) {   
  42.             e.printStackTrace();  
  43.             return new File(picPath);  
  44.         }finally{  
  45.             if(bitmap!=null && !bitmap.isRecycled()){  
  46.                 bitmap.recycle();  
  47.             }  
  48.             if(resizedBitmap!=null && !resizedBitmap.isRecycled()){  
  49.                 resizedBitmap.recycle();  
  50.             }  
  51.         }  
  52.         return file;  
  53.     }   
  54. }  
 

-------------------------------------我是個(gè)華麗的分割線,,哇哈哈-----------------------------------------------

做完這個(gè)拍照后,,感覺功能太簡(jiǎn)單,比如:設(shè)置圖片大小,,白天夜晚照相等等一些系統(tǒng)照相機(jī)帶的功能都沒有,,因此用在項(xiàng)目中感覺不炫。 然后就用了簡(jiǎn)單點(diǎn)的,,直接調(diào)用系統(tǒng)照相機(jī)了,。本來想著簡(jiǎn)單呢,后來也遇到點(diǎn)問題。
    (1)根據(jù)Camera Activity返回的時(shí)候,,會(huì)帶一個(gè)名為data的Bitmap對(duì)象,,照片的縮略圖(這個(gè)地方可以做各種修改,我沒用到不說了),,上代碼
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.      * 檢測(cè)手機(jī)是否存在SD卡,網(wǎng)絡(luò)連接是否打開 
  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("檢測(cè)到手機(jī)沒有存儲(chǔ)卡,!請(qǐng)插入手機(jī)存儲(chǔ)卡再開啟本應(yīng)用。")  
  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保存圖像數(shù)據(jù)的key是data,,返回的數(shù)據(jù)類型是Bitmap對(duì)象            
  35.                 Bitmap cameraBitmap = (Bitmap) data.getExtras().get("/sdcard/rtest.jpg");           
  36.                 //  在ImageView組件中顯示拍攝的照片           
  37.                 image.setImageBitmap(cameraBitmap);   
  38.   
  39.                 // 做自己的業(yè)務(wù)操作,。。,。,。  
  40.                 }        
  41.       super.onActivityResult(requestCode, resultCode, data);    
  42.                 }   
 
   (2)以上代碼在我的小米手機(jī)上測(cè)試時(shí),出現(xiàn)問題了,。 返回的name為data的Bitmap對(duì)象是個(gè)Null,我發(fā)現(xiàn)小米照完相片之后,他會(huì)先跳到一個(gè)預(yù)覽的界面(系統(tǒng)自帶的頁面),,所以得不到Bitmap對(duì)象了,。
因此我就先保存照片以及其路徑,然后在onActivityResult中獲取圖片,,做業(yè)務(wù)操作,,代碼如下:
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.       //.....做一些業(yè)務(wù)操作  
  28.     } catch (Exception e) {  
  29.         e.printStackTrace();  
  30.     }  
  31.     super.onActivityResult(requestCode, resultCode, data);  
  32.   }  
 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多