上傳圖像之裁剪

来源:http://www.cnblogs.com/magics/archive/2016/03/26/5323652.html
-Advertisement-
Play Games

一個但凡涉及到用戶信息的應用,總少不了設置用戶圖像這個小功能。之前做這塊的時候只是簡單的複製粘貼導致最近再做這個功能的時候,卻發現問題很多,拍照及相冊選擇後啟動系統裁剪要不崩潰要不就是沒有返回數據,今天好好梳理一下這個功能。 調用系統拍照界面: 調用系統相冊界面: 這裡補充一下,很多網友都說andr ...


  一個但凡涉及到用戶信息的應用,總少不了設置用戶圖像這個小功能。之前做這塊的時候只是簡單的複製粘貼導致最近再做這個功能的時候,卻發現問題很多,拍照及相冊選擇後啟動系統裁剪要不崩潰要不就是沒有返回數據,今天好好梳理一下這個功能。
  調用系統拍照界面:

private void startTakePhotoActivity() {
        temp_file_name = String.valueOf(System.currentTimeMillis()) + FILE_SUFFIX;
        temp_photo_uri = Uri.fromFile(new File(DIRECTORY, temp_file_name));
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 預設情況下不需要指定拍照生成圖片的uri 系統預設返回照片縮略圖uri
        // 如果用戶指定了生成圖片的uri 系統就不會返回
        intent.putExtra(MediaStore.EXTRA_OUTPUT, temp_photo_uri);
        startActivityForResult(intent, FLAG_CAMERA);
}

  調用系統相冊界面:

private void startPickPhotoActivity() {
        // temp_file_name未賦值 在這裡對其初始化
        temp_file_name = System.currentTimeMillis() + FILE_SUFFIX;
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, FLAG_GALLERY);
}

  這裡補充一下,很多網友都說android4.4以上怎麼怎麼了,其實不用想這麼多,看看代碼是不是還和以前沒什麼兩樣?看到有網友專門針對4.4以上版本及以下版本判斷,也只是因為4.4以上版本從相冊選擇圖片時提供另外一個意圖 Intent.ACTION_OPEN_DOCUMENT 可以使用最近瀏覽過的圖片,代碼量卻大了不少。所以個人覺得就一個選擇圖片沒必要做這麼複雜,因此我還是使用相冊來選圖。
  調用系統裁剪界面:

private void startCropPhotoActivity(Uri orgUri) {
        // 保存剪裁生成圖片的uri
        String _fileName = "_" + System.currentTimeMillis() + ".jpg";
        temp_photo_uri = Uri.fromFile(new File(DIRECTORY, _fileName));
        // 剪裁圖片意圖
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(orgUri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 640);
        intent.putExtra("outputY", 640);
        intent.putExtra("scale", true);
        // 將剪切的圖片保存到目標Uri中 註釋同拍照
        intent.putExtra(MediaStore.EXTRA_OUTPUT, temp_photo_uri);
        intent.putExtra("return-data", false);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG);
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, FLAG_CROP);
}

 

  雖然代碼中已經加了註釋,還是要和大伙啰嗦一下上面紅色加粗的代碼。之前沒有好好理解才導致在這裡栽個大跟頭。
  intent.putExtra(MediaStore.EXTRA_OUTPUT, temp_photo_uri):用來指定拍照或裁剪後生成的圖片存儲在哪裡,如果指定了這個參數,那麼拍照後就不會返回生成縮略圖的Uri,當然再用 intent.getData 勢必會 NullPointException,這時候再要用到Uri就得從文件來或者乾脆造個成員變數來保存這個Uri。
  到這裡問題基本上已經解決,但是現在是一個雲的時代,大多對android系統個性後的ROM,相冊這個功能看起來是很強大,但給開發者帶來卻是無盡的痛苦,接下來說說這個 雲相冊 引發的問題。
  回到我的代碼,拍照已經OK,就是從相冊選擇圖片在 onActivityResult 返回得到 resultCode 始終為 0 (正常 RESULT_OK = -1),經過對比返回的Uri發現問題並不是大家所說的Uri格式不對,而是在測試的手機上 根本找不到選擇的照片 。但為什麼還顯示在這裡,並且選擇後返回的Uri看起來和本地照片沒什麼區別,這些三方廠商給開發者挖了這麼大個坑坑。好了,問題找到就好辦了,既然是圖片不存在,那我們就得讓用戶知道選擇的這張圖片不在手機上,避免了程式崩潰也提高了用戶體驗,如果有力氣的話,完全可以不用系統的相冊來選擇這樣就不會發生上面提到的這個問題。
  說了這麼多,好像廢話一籮筐,針對這次出現的問題,參考了好幾個網友提供的代碼,裡面不乏有值得我借鑒的東西,也給大伙分享一下,CameraActivity是我修改過的,在android4.4及4.1上測試通過。有空再封裝一個工具類出來。
  
  代碼下載:http://pan.baidu.com/s/1miq120g

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是深入淺出React Native教程的第二篇文章。 1. 環境配置 React Native環境配好之後,就可以開始創建我們的第一個App啦。 打開控制台,輸入 上述命令的作用是在當前文件夾下創建一個名字叫AwesomeProject的項目模板。在運行該命令之前,可以先用cd命令到自己想創建re ...
  • 一首先下載Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依賴 二--下載一張圖片並顯示 使用的是hanlder的方式 也可以把網路請求寫為一個工具類, get方式 ...
  • 展示效果如下: 大家可以看到這個界面很簡單,其實就是UITableView的佈局, 但是難點是在於如何從網上下載這些圖片,下載之後應如何進行存儲! 我們一步一步進行解析,先從單線程(主線程)進行多圖片下載 我們佈局上的文字及圖片的地址從plist文件中進行讀取 根據結構,我們自定義一個數據模型文件 ...
  • 今天在寫項目的時候,遇到了一件令人抓狂的事情。 正如標題所示,被這個方法弄的團團轉。 -(void)scrollViewDidEndScrollingAnimation:是協議里的方法。 意味當動畫結束時調用。 動畫?為什麼會有動畫呢? setContentOffset: animated: -這一 ...
  • 該教程主要介紹如何用react native來開發iOS,所以首先,你需要有一臺mac,當然黑蘋果也是可以的~ 創建一個react native的項目只需要安裝以下五個組件~~(但....坑爹的是,不翻牆的話安裝慢成狗呀) 1. 安裝 xcode 做過ios相關開發的都知道這個,作為ios開發的首席 ...
  • 廣播的概念 現實中:我們常常使用電臺通過發送廣播發佈消息,買個收音機,就能收聽 Android:系統在產生某個事件時發送廣播,應用程式使用廣播接收者接收這個廣播,就知道系統產生了什麼事件。Android系統在運行的過程中,會產生很多事件,比如開機、電量改變、收發簡訊、撥打電話、屏幕解鎖 廣播接收者的 ...
  • 本篇主要講述在 OC 開發中主要涉及到的運行時機制: 運行時的工作: 運行時在 OC 中的工作:OC 語言的設計模式決定了儘可能的把程式從編譯和鏈接時推遲到運行時。只要有可能,OC 總是使用動態的方式來解決問題。這意味著 OC 語言不僅需要一個編譯器,同時也需要一個運行時系統來執行編譯好的代碼。這兒 ...
  • Atitit.反編譯apk android源碼以及防止反編譯apk 1.1. Tool apk逆向助手1 1.2. 二、使用dex2jar + jd-gui 得到apk的java源碼1 1.3. 用命令(dex2jar.bat classes.dex)得到一個 jar文件1 2. Apk文件的結構2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...