從相冊獲取圖片及調用相機拍照獲取圖片,最後上傳圖片到伺服器

来源:http://www.cnblogs.com/shenchanghui/archive/2016/08/17/5778608.html
-Advertisement-
Play Games

調用相機拍照獲取圖片: 跳轉到到拍照界面: Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //下麵這句指定調用相機拍照後的照片存儲的路徑 mSzImageFileName = Long.toString(System ...


調用相機拍照獲取圖片: 跳轉到到拍照界面:   Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //下麵這句指定調用相機拍照後的照片存儲的路徑 mSzImageFileName = Long.toString(System.currentTimeMillis()) + ".png"; takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), mSzImageFileName))); startActivityForResult(takeIntent, REQUEST_TAKE_PHOTO);   從相冊獲取圖片:  從相冊選擇圖片:   Intent pickIntent = new Intent(Intent.ACTION_PICK, null); // 如果要限制上傳到伺服器的圖片類型時可以直接寫如:image/jpeg 、 image/png等的類型 pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, REQUEST_PICK_PHOTO);    從相冊返回一張圖片或者拍照返回一張圖片: 監聽返回結果: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_PICK_PHOTO:// 直接從相冊獲取 try { startPhotoZoom(data.getData());//跳轉到截圖界面 } catch (NullPointerException e) { e.printStackTrace();// 用戶點擊取消操作 } break; case REQUEST_TAKE_PHOTO:// 調用相機拍照 mHandler.postDelayed(new Runnable() { @Override public void run() { File temp = new File(Environment.getExternalStorageDirectory(), mSzImageFileName); if (temp.exists()) { startPhotoZoom(Uri.fromFile(temp));//跳轉到截圖界面 } } }, 1000); break; case REQUEST_CUT_PHOTO:// 取得裁剪後的圖片 if (data != null) { setPicToView(data);//保存和上傳圖片 } break; }   super.onActivityResult(requestCode, resultCode, data); }   返回圖片後進行裁剪: 裁剪圖片: /** * 裁剪圖片方法實現 */ private void startPhotoZoom(Uri uri) { LogUtil.e("PersonalInformationActivity", "onActivityResult uri" + uri); if (uri != null) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下麵這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); startActivityForResult(intent, REQUEST_CUT_PHOTO); } }   裁剪後保存和上傳圖片: /** * 保存裁剪之後的圖片數據 * * @param picdata */ private void setPicToView(Intent picdata) { Bundle extras = picdata.getExtras(); if (extras != null) { // 取得SDCard圖片路徑做顯示 Bitmap photo = extras.getParcelable("data"); mSzImageFileName = Long.toString(System.currentTimeMillis()) + ".png"; mImgUrlPath = Environment.getExternalStorageDirectory() + File.separator + "cut_image" + File.separator + mSzImageFileName; try { NetUtil.saveBitmapToFile(photo, mImgUrlPath); } catch (IOException e) { e.printStackTrace(); }     // 新線程後臺上傳服務端 new Thread(uploadImageRunnable).start(); } }   上傳圖片的線程: Runnable uploadImageRunnable = new Runnable() { @Override public void run() { Map<String, String> params = new HashMap<>(); params.put("mid", mSzId);//上傳參數 Map<String, File> files = new HashMap<>(); files.put("myUpload", new File(mImgUrlPath));//上傳文件路徑 try { String json = NetUtil.uploadFile(Constants.URL_EDIT_IMG, params, files); //json為伺服器返回的數據,可自己解析(如json解析)取得想要的數據 } } } catch (IOException e) { e.printStackTrace(); } } };   保存圖片和上傳圖片的工具類NetUtil : public class NetUtil { //上傳圖片到伺服器 public static String uploadFile(String url, Map<String, String> params, Map<String, File> files) throws IOException { String tempStr = null; String BOUNDARY = java.util.UUID.randomUUID().toString(); String PREFIX = "--", LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; HttpURLConnection conn = null; try { URL uri = new URL(url); conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(10 * 1000); // 緩存的最長時間 conn.setDoInput(true);// 允許輸入 conn.setDoOutput(true);// 允許輸出 conn.setUseCaches(false); // 不允許使用緩存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); // 首先組拼文本類型的參數 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND); sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND); sb.append("Content-Transfer-Encoding: 8bit" + LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); } LogUtil.e("NetUtil", "uploadFile sb:" + sb.toString()); DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); outStream.write(sb.toString().getBytes()); // 發送文件數據 if (files != null) for (Map.Entry<String, File> file : files.entrySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name="+file.getKey()+"; filename=\"" + file.getValue() + "\"" + LINEND); sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND); sb1.append(LINEND); LogUtil.e("NetUtil", "uploadFile sb1:" + sb1.toString()); outStream.write(sb1.toString().getBytes()); InputStream is = new FileInputStream(file.getValue()); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); outStream.write(LINEND.getBytes()); } // 請求結束標誌 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); outStream.close(); StringBuilder sb2 = new StringBuilder(); BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), CHARSET)); String inputLine; while ((inputLine = in.readLine()) != null) { sb2.append(inputLine); } in.close(); tempStr = sb2.toString(); } catch (Exception e) { } finally { if (conn != null) { conn.disconnect(); } } return tempStr; }   /** * Save Bitmap to a file.保存圖片到SD卡。 * * @param bitmap * @return error message if the saving is failed. null if the saving is * successful. * @throws IOException */ public static void saveBitmapToFile(Bitmap bitmap, String _file) throws IOException { BufferedOutputStream os = null; try { File file = new File(_file); int end = _file.lastIndexOf(File.separator); String _filePath = _file.substring(0, end); File filePath = new File(_filePath); if (!filePath.exists()) { filePath.mkdirs(); } file.createNewFile(); os = new BufferedOutputStream(new FileOutputStream(file)); bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); } finally { if (os != null) { try { os.close(); } catch (IOException e) { } } } } }
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境:準備測試前,我查看了一下我公司的電腦是4核的(四個子視窗) 廢話少說,直接附上代碼和結果吧 測試代碼 運行結果: 資料庫的結果: 看到了吧,確實插入了1000萬條,準確無誤 然後我就想試試20個線程,每個線程插入50萬條數據看看性能怎麼樣。結果如下: 線程越多不是好事,反而更慢。。。 當線程達 ...
  • 為了保證臨界資源的安全性和可靠性,線程不得不使用鎖,同一時間只允許一個或幾個線程訪問變數。常用的鎖有互斥量,讀寫鎖,條件變數 一、互斥量 互斥量是用pthread_mutex_t數據類型表示的,在使用之前,必須對其進行初始化,可以把它設置為PTHREAD_MUTEX_INITIALIZER(只適於靜 ...
  • 一 、安裝java jdk配置環境變數 1、 卸載原有openjdk yum -y remove java-1.7.0-openjdk* yum -y remove tzdata-java.noarch 2、 下載新的jdk 並解壓 [root@localhost java]# curl -O ht ...
  • 很多kali愛好者想把kali linux作為系統使用,但是有些win下的程式有時候也需要用到,此時需要虛擬機。 kali系統在安裝虛擬機的時候也會遇到一大堆坑,接下來是我的爬坑過程。 一波三折。 環境 :kali linux 2.0 32位 軟體 :virtualbox 虛擬機 0x01 bash ...
  • typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,總為0 DWORD TimeDateStamp; // 文件創建時間戳 WORD MajorVersion; // 未使用,總為0 WORD MinorVer... ...
  • Touch ID是iPhone5S後加入的一項新的功能,也就是大家熟知的指紋識別技術。大家用得最多的可能是手機的解屏操作,不用在和以前一樣輸入手機的四位數密碼進行驗證。一方面不用擔心密碼被別人看到,另一方面也方便了自己的操作。iOS8後蘋果開放了Touch ID的API給開發者,這也給我們的app帶 ...
  • 如果你對iOS逆向工程有所瞭解,那麼你對Tweak並不陌生。那麼由Tweak我們又會引出Theos, 那麼什麼是Theos呢,簡單一句話,Theos是一個越獄開發工具包,Theos是越獄開發工具的首先,因為其最大的特點就是簡單。大道至簡,Theos的下載安裝、編譯發佈都比較簡單,越獄開發中另一個常用 ...
  • 一,效果圖。 二,工程圖。 三,代碼。 AppDelegate.m ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...