Android中通過(guò)訪問(wèn)本地相冊(cè)或者相機(jī)設(shè)置用戶(hù)頭像實(shí)例
目前幾乎所有的APP在用戶(hù)注冊(cè)時(shí)都會(huì)有設(shè)置頭像的需求,大致分為三種情況:
(1)通過(guò)獲取本地相冊(cè)的圖片,經(jīng)過(guò)裁剪后作為頭像。
(2)通過(guò)啟動(dòng)手機(jī)相機(jī),現(xiàn)拍圖片然后裁剪作為頭像。
(3)在APP中添加一些自帶的頭像資源,供用戶(hù)選擇(不夠人性化,目前很少使用)。
這次我們簡(jiǎn)單介紹下通過(guò)獲取本地相冊(cè)以及相機(jī)拍攝的方法設(shè)置頭像,實(shí)現(xiàn)思路如下:
(1)通過(guò)startActivityForResult方法,分別傳遞調(diào)用系統(tǒng)相冊(cè)的Intent和調(diào)用相機(jī)拍照的Intent來(lái)做選擇
(2)調(diào)用Android系統(tǒng)中自帶的圖片剪裁,實(shí)現(xiàn)圖片的剪裁并在onActivityResult方法中獲取數(shù)據(jù)。
本次演示效果如下(分別為從本地相冊(cè)獲取以及從相機(jī)拍攝獲取頭像):
簡(jiǎn)單布局文件這里不再做贅述,本次試驗(yàn)使用隱式intent調(diào)用相機(jī)以及本地相冊(cè),未在配置清單上添加權(quán)限,依然可以調(diào)用。
java實(shí)現(xiàn)代碼如下:
import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button buttonLocal, buttonCamera; private ImageView imageView; //相機(jī)拍攝的頭像文件(本次演示存放在SD卡根目錄下) private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg"); //請(qǐng)求識(shí)別碼(分別為本地相冊(cè)、相機(jī)、圖片裁剪) private static final int CODE_PHOTO_REQUEST = 1; private static final int CODE_CAMERA_REQUEST = 2; private static final int CODE_PHOTO_CLIP = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonLocal = (Button) findViewById(R.id.buttonLocal); buttonCamera = (Button) findViewById(R.id.buttonCamera); imageView = (ImageView) findViewById(R.id.imageView); buttonLocal.setOnClickListener(this); buttonCamera.setOnClickListener(this); } //設(shè)置點(diǎn)擊事件 @Override public void onClick(View view) { switch (view.getId()) { case R.id.buttonLocal: //調(diào)用獲取本地圖片的方法 getPicFromLocal(); break; case R.id.buttonCamera: //調(diào)用相機(jī)拍照的方法 getPicFromCamera(); break; default: break; } } /** * 從本機(jī)相冊(cè)獲取圖片 */ private void getPicFromLocal() { Intent intent = new Intent(); // 獲取本地相冊(cè)方法一 intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); //獲取本地相冊(cè)方法二 // intent.setAction(Intent.ACTION_PICK); // intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // "image/*"); startActivityForResult(intent, CODE_PHOTO_REQUEST); } /** * 通過(guò)相機(jī)拍攝獲取圖片, * 并存入設(shè)置的路徑中 */ private void getPicFromCamera() { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 下面這句指定調(diào)用相機(jī)拍照后的照片存儲(chǔ)的路徑 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON)); startActivityForResult(intent, CODE_CAMERA_REQUEST); } /** * 圖片裁剪 * * @param uri */ private void photoClip(Uri uri) { // 調(diào)用系統(tǒng)中自帶的圖片剪裁 Intent intent = new Intent(); intent.setAction("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面這個(gè)crop=true是設(shè)置在開(kāi)啟的Intent中設(shè)置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); /*outputX outputY 是裁剪圖片寬高 *這里僅僅是頭像展示,不建議將值設(shè)置過(guò)高 * 否則超過(guò)binder機(jī)制的緩存大小的1M限制 * 報(bào)TransactionTooLargeException */ intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, CODE_PHOTO_CLIP); } /** * 提取保存裁剪之后的圖片數(shù)據(jù),并設(shè)置頭像部分的View */ private void setImageToHeadView(Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); imageView.setImageBitmap(photo); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 用戶(hù)沒(méi)有進(jìn)行有效的設(shè)置操作,返回 if (resultCode == RESULT_CANCELED) { Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show(); return; } switch (requestCode) { case CODE_CAMERA_REQUEST: if (USER_ICON.exists()) { photoClip(Uri.fromFile(USER_ICON)); } break; case CODE_PHOTO_REQUEST: if (data != null) { photoClip(data.getData()); } break; case CODE_PHOTO_CLIP: if (data != null) { setImageToHeadView(data); } break; } super.onActivityResult(requestCode, resultCode, data); } }
這里要注意的是在裁剪圖片時(shí),長(zhǎng)和寬不要設(shè)置太大,否則超過(guò)binder機(jī)制的緩存大小的限制(受手機(jī)配置影響).報(bào)TransactionTooLargeException,在代碼中已經(jīng)做了詳細(xì)標(biāo)注,請(qǐng)各位看官在實(shí)現(xiàn)的時(shí)候萬(wàn)萬(wàn)注意。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android工具類(lèi)ImgUtil選擇相機(jī)和系統(tǒng)相冊(cè)
- Android 相機(jī)相冊(cè)權(quán)限設(shè)置方法
- Android編程實(shí)現(xiàn)調(diào)用相冊(cè)、相機(jī)及拍照后直接裁剪的方法
- android中打開(kāi)相機(jī)、打開(kāi)相冊(cè)進(jìn)行圖片的獲取示例
- Android 系統(tǒng)相機(jī)拍照后相片無(wú)法在相冊(cè)中顯示解決辦法
- Android打開(kāi)相機(jī)和相冊(cè)實(shí)例代碼
- Android開(kāi)發(fā)從相機(jī)或相冊(cè)獲取圖片裁剪
- Android實(shí)現(xiàn)讀取相機(jī)(相冊(cè))圖片并進(jìn)行剪裁
- Android網(wǎng)頁(yè)H5 Input選擇相機(jī)和系統(tǒng)相冊(cè)
相關(guān)文章
Android學(xué)習(xí)之介紹Binder的簡(jiǎn)單使用
BInder方面的資料雖然感覺(jué)看的比較多,但是真正用的時(shí)候才發(fā)現(xiàn)有很多地方模棱兩棵的,所以,打算用一個(gè)實(shí)例再來(lái)鞏固一下binder的使用方法。這篇文章主要介紹了Android中Binder的簡(jiǎn)單使用,文中給出詳細(xì)的示例代碼,需要的朋友可以參考下2016-12-12Android Studio中使用lambda表達(dá)式的方法
這篇文章主要介紹了Android Studio中使用lambda表達(dá)式的方法,需要的朋友可以參考下2017-06-06Android RecyclerView的Item自定義動(dòng)畫(huà)及DefaultItemAnimator源碼分析
這篇文章主要介紹了Android RecyclerView的Item自定義動(dòng)畫(huà)及DefaultItemAnimator源碼,感興趣的小伙伴們可以參考一下2016-07-07Android實(shí)現(xiàn)橫向二級(jí)菜單
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)橫向二級(jí)菜單的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03Android 照片選擇區(qū)域功能實(shí)現(xiàn)示例
這篇文章主要介紹了Android 照片選擇區(qū)域功能實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Android啟動(dòng)頁(yè)優(yōu)化之實(shí)現(xiàn)應(yīng)用秒開(kāi)
現(xiàn)在很多應(yīng)用都會(huì)在進(jìn)入主界面之前,添加一個(gè)啟動(dòng)頁(yè),然后加入幾秒鐘的廣告,我覺(jué)得這個(gè)不能算是 “真正意義上的 “ 啟動(dòng)頁(yè),應(yīng)該叫廣告頁(yè)。2021-05-05Android如何實(shí)現(xiàn)一個(gè)DocumentProvider示例詳解
這篇文章主要為大家介紹了Android如何實(shí)現(xiàn)一個(gè)DocumentProvider示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android學(xué)習(xí)教程之下拉刷新實(shí)現(xiàn)代碼(11)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之下拉刷新實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android 圖片切換器(dp、sp、px) 的單位轉(zhuǎn)換器
這篇文章主要介紹了Android 圖片切換器(dp、sp、px) 的單位轉(zhuǎn)換器的相關(guān)資料,需要的朋友可以參考下2017-03-03