Android中通過訪問本地相冊或者相機設置用戶頭像

来源:http://www.cnblogs.com/panhouye/archive/2017/01/08/6262511.html
-Advertisement-
Play Games

目前幾乎所有的APP在用戶註冊時都會有設置頭像的需求,大致分為三種情況: (1)通過獲取本地相冊的圖片,經過裁剪後作為頭像。 (2)通過啟動手機相機,現拍圖片然後裁剪作為頭像。 (3)在APP中添加一些自帶的頭像資源,供用戶選擇(不夠人性化,目前很少使用)。 這次我們簡單介紹下通過獲取本地相冊以及相 ...


目前幾乎所有的APP在用戶註冊時都會有設置頭像的需求,大致分為三種情況:

(1)通過獲取本地相冊的圖片,經過裁剪後作為頭像。

(2)通過啟動手機相機,現拍圖片然後裁剪作為頭像。

(3)在APP中添加一些自帶的頭像資源,供用戶選擇(不夠人性化,目前很少使用)。

這次我們簡單介紹下通過獲取本地相冊以及相機拍攝的方法設置頭像,實現思路如下:

(1)通過startActivityForResult方法,分別傳遞調用系統相冊的Intent和調用相機拍照的Intent來做選擇

(2)調用Android系統中自帶的圖片剪裁,實現圖片的剪裁併在onActivityResult方法中獲取數據。

關於如何處理Activity的返回結果,請參照往期博文《Android中Activity處理返回結果的實現方式》。

本次演示效果如下(分別為從本地相冊獲取以及從相機拍攝獲取頭像):

 

簡單佈局文件這裡不再做贅述,本次試驗使用隱式intent調用相機以及本地相冊,未在配置清單上添加許可權,依然可以調用。java實現代碼如下:

  1 import android.content.Intent;
  2 import android.graphics.Bitmap;
  3 import android.net.Uri;
  4 import android.os.Bundle;
  5 import android.os.Environment;
  6 import android.provider.MediaStore;
  7 import android.support.v7.app.AppCompatActivity;
  8 import android.view.View;
  9 import android.widget.Button;
 10 import android.widget.ImageView;
 11 import android.widget.Toast;
 12 import java.io.File;
 13 
 14 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 15     private Button buttonLocal, buttonCamera;
 16     private ImageView imageView;
 17     //相機拍攝的頭像文件(本次演示存放在SD卡根目錄下)
 18     private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg");
 19     //請求識別碼(分別為本地相冊、相機、圖片裁剪)
 20     private static final int CODE_PHOTO_REQUEST = 1;
 21     private static final int CODE_CAMERA_REQUEST = 2;
 22     private static final int CODE_PHOTO_CLIP = 3;
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         setContentView(R.layout.activity_main);
 27         buttonLocal = (Button) findViewById(R.id.buttonLocal);
 28         buttonCamera = (Button) findViewById(R.id.buttonCamera);
 29         imageView = (ImageView) findViewById(R.id.imageView);
 30         buttonLocal.setOnClickListener(this);
 31         buttonCamera.setOnClickListener(this);
 32     }
 33     //設置點擊事件
 34     @Override
 35     public void onClick(View view) {
 36         switch (view.getId()) {
 37             case R.id.buttonLocal:
 38                 //調用獲取本地圖片的方法
 39                 getPicFromLocal();
 40                 break;
 41             case R.id.buttonCamera:
 42                 //調用相機拍照的方法
 43                 getPicFromCamera();
 44                 break;
 45             default:
 46                 break;
 47         }
 48     }
 49     /**
 50      * 從本機相冊獲取圖片
 51      */
 52     private void getPicFromLocal() {
 53         Intent intent = new Intent();
 54         // 獲取本地相冊方法一
 55         intent.setAction(Intent.ACTION_GET_CONTENT);
 56         intent.setType("image/*");
 57         //獲取本地相冊方法二
 58 //        intent.setAction(Intent.ACTION_PICK);
 59 //        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
 60 //                "image/*");
 61         startActivityForResult(intent, CODE_PHOTO_REQUEST);
 62     }
 63     /**
 64      * 通過相機拍攝獲取圖片,
 65      * 並存入設置的路徑中
 66      */
 67     private void getPicFromCamera() {
 68         Intent intent = new Intent();
 69         intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
 70         // 下麵這句指定調用相機拍照後的照片存儲的路徑
 71         intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON));
 72         startActivityForResult(intent, CODE_CAMERA_REQUEST);
 73     }
 74     /**
 75      * 圖片裁剪
 76      *
 77      * @param uri
 78      */
 79     private void photoClip(Uri uri) {
 80         // 調用系統中自帶的圖片剪裁
 81         Intent intent = new Intent();
 82         intent.setAction("com.android.camera.action.CROP");
 83         intent.setDataAndType(uri, "image/*");
 84         // 下麵這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪
 85         intent.putExtra("crop", "true");
 86         // aspectX aspectY 是寬高的比例
 87         intent.putExtra("aspectX", 1);
 88         intent.putExtra("aspectY", 1);
 89         /*outputX outputY 是裁剪圖片寬高
 90          *這裡僅僅是頭像展示,不建議將值設置過高
 91          * 否則超過binder機制的緩存大小的1M限制
 92          * 報TransactionTooLargeException
 93          */
 94         intent.putExtra("outputX", 150);
 95         intent.putExtra("outputY", 150);
 96         intent.putExtra("return-data", true);
 97         startActivityForResult(intent, CODE_PHOTO_CLIP);
 98     }
 99     /**
100      * 提取保存裁剪之後的圖片數據,並設置頭像部分的View
101      */
102     private void setImageToHeadView(Intent intent) {
103         Bundle extras = intent.getExtras();
104         if (extras != null) {
105             Bitmap photo = extras.getParcelable("data");
106             imageView.setImageBitmap(photo);
107         }
108     }
109     @Override
110     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
111         // 用戶沒有進行有效的設置操作,返回
112         if (resultCode == RESULT_CANCELED) {
113             Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();
114             return;
115         }
116         switch (requestCode) {
117             case CODE_CAMERA_REQUEST:
118                 if (USER_ICON.exists()) {
119                     photoClip(Uri.fromFile(USER_ICON));
120                 }
121                 break;
122             case CODE_PHOTO_REQUEST:
123                 if (data != null) {
124                     photoClip(data.getData());
125                 }
126                 break;
127             case CODE_PHOTO_CLIP:
128                 if (data != null) {
129                     setImageToHeadView(data);
130                 }
131                 break;
132         }
133         super.onActivityResult(requestCode, resultCode, data);
134     }
135 }

這裡要註意的是在裁剪圖片時,長和寬不要設置太大,否則超過binder機制的緩存大小的限制(受手機配置影響).報TransactionTooLargeException,在代碼中已經做了詳細標註,請各位看官在實現的時候萬萬註意。


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

-Advertisement-
Play Games
更多相關文章
  • 0.float與margin 兩個相鄰的浮動元素,當第一個浮動元素(不論是左浮動還是右浮動)的寬度為100%時,第二個浮動元素會被擠到下麵,通過添加負margin-right值(絕對值最少等於它自身的寬度),可以使它回到第一行。 在書寫html代碼時,我們通常的習慣根據UI樣式,從左往右來寫代碼,但 ...
  • 源於前段時候微信小程式最初火爆公測時段,把以前用 Canvas 實現的大轉盤抽獎移植成微信小程式,無奈當時小程式對 Canvas 支持不夠完善,只好降低用 CSS3 實現。雖然比不上 Canvas 繪圖的絢麗,但也總算完成了一個抽獎的 Demo,詳見: "https://github.com/giv ...
  • ▓▓▓▓▓▓ 大致介紹 看到了一個輪播圖的思路,就想的自己動手實踐一下,總體來說用jQuery實現起來簡單多了 如果對代碼中使用的方法有疑問,可以參考我的jQuery學習之路(持續更新),裡面有講解;或者你和我一樣學習jQuery不久,那你可以看看我的jQuery小案例(持續更新),互相學習! 預覽 ...
  • 將html模板放入script標簽中 使用javascript開始解析模板 ...
  • 分享一下編寫設置和獲取顏色的插件,首先我將插件的名字命名為jquery.color.js。該插件用來實現以下兩個功能1.設置元素的顏色。2.獲取元素的顏色。 先在搭建好如下編寫插件的框架: 我這裡採用jQuery.fn.extend().這種方法來編寫,代碼如下: 這個方法可裡面有一個value.參 ...
  • 目前的多個項目中都用到分頁這個功能,為了提高可復用性,我特地分離出來寫了個分頁的指令。直接貼代碼,詳情如下: index.html index.js 指令模板 page.html 指令定義page.js 效果如圖所示: ...
  • JQuery極大的提高了我們編寫JavaScript的效率,讓我們可以愉快的編寫代碼,做出各種特效。大多數情況下,我們都是使用別人開發的JQuery插件,今天我們就來看看如何把我們常用的功能做出JQuery插件,然後像使用jQuery那樣來操作DOM. 一、jQuery插件開發快速上手 1、jQue ...
  • Vue有一核心就是數據驅動(Data Driven),允許我們採用簡潔的模板語法來聲明式的將數據渲染進DOM,且數據與DOM是綁定在一起的,這樣當我們改變Vue實例的數據時,對應的DOM元素也就會改變了。 今兒,我們就一起來模擬一下它吧。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...