Android 拍照、从相册选择图片
在做Android圖片上傳功能的時候,獲取圖片的途徑一般都有兩種:拍照、從相冊選擇。
一、拍照
調用相機拍照有兩種方法:
1.直接返回圖片
private int TAKE_SMALL_PHOTO_REQUEST=0;//全局變量Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, TAKE_PHOTO_REQUEST);??就是通過Intent發(fā)出隱式意圖,制定action為MediaStore.ACTION_IMAGE_CAPTURE,來調用系統(tǒng)的相機。并返回相機拍的圖片。在onActivityResult方法里接收。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_CANCELED) {Toast.makeText(context, "拍照取消!", Toast.LENGTH_LONG).show();return;}if (resultCode == RESULT_OK) {switch (requestCode) {case TAKE_PHOTO_REQUEST:// 拍照返回結果Bitmap photo = data.getParcelableExtra("data");// 按需求處理photo break;}}}??返回的圖片以bitmap的格式存放在data的key值是“date”中。取出后可進行相應的操作,比如顯示、保存、上傳。但是,要注意的是這是返回的bitmap是被系統(tǒng)用默認壓縮方式壓縮過的圖片。那么要想獲取原圖或用自己的壓縮方式處理怎么辦呢?就要用到方法二了。
2.在調用相機的時候,傳入uri,拍照后通過該uri來獲取圖片
//全局變量 private int TAKE_BIG_PHOTO_REQUEST=1; private Uri imageUri;imageUri = createImageUri(context);//創(chuàng)建存儲圖片的uri,該方法見下邊的講解 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, TAKE_BIG_PHOTO_REQUEST);@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_CANCELED) {deleteUri(imageUri, null, null);// 拍照取消,刪除不用的文件Toast.makeText(context, "拍照取消!", Toast.LENGTH_LONG).show();return;}if (resultCode == RESULT_OK) {switch (requestCode) {case TAKE_BIG_PHOTO_REQUEST:// 直接使用之前新建的圖片uri,來操作圖片// 按需求處理photo,比如顯示 iv.setImageURI(imageUri);break;}}}??這種方法是向Intent中添加一條圖片的uri數(shù)據(jù),這時拍照完成后,系統(tǒng)會將圖片存在這個uri中,在onActivityResult中,就可以直接使用這個uri操作圖片了。隱式意圖“MediaStore.ACTION_IMAGE_CAPTURE”和關鍵字“MediaStore.EXTRA_OUTPUT”也可以分別用“android.media.action.IMAGE_CAPTURE”和“output”代替。都是一個意思,只不過是不同的表示方法。
??刪除文件方法deleteUri(imageUri, null, null),參考我的一篇博客[Android 根據(jù)Uri刪除文件](http://blog.csdn.net/mamr227/article/details/77683729)里的兩種刪除方法,文章的最后有一個綜合方法,不同的方法為了兼容下邊創(chuàng)建存儲圖片、獲取uri的兩種不同的方法。
創(chuàng)建存儲圖片、獲取uri
1. 方法一
private Uri createImageUri(Context context){Uri uri = null;if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){String name = String.valueOf(System.currentTimeMillis());ContentValues contentValues = new ContentValues();contentValues.put(MediaStore.Images.Media.TITLE, name);contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, name + ".jpeg");contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);}return uri; }??創(chuàng)建文件和獲取uri同時進行。
??首先將圖片的文件信息保存在ContentValues 中,在通過ContentResolver類的insert方法來創(chuàng)建圖片文件,并獲取uri。該uri是以“content://”開頭的,因此,可以用在Android 7.0以上版本。
??優(yōu)點:簡單。
??缺點:只能進行外部存儲,存放圖片的默認文件夾Pictures。原因是:
????insert方法創(chuàng)建時只有兩種存儲方式:
???????? 1.EXTERNAL_CONTENT_URI,就是現(xiàn)在用的。
???????? 2.INTERNAL_CONTENT_URI,指向的是內部存儲的根目錄,而我們是訪問不了的,會報錯。
??不熟悉外部存儲和內部存儲的小伙伴可以參考我的一篇博客Android內部存儲與外部存儲解析 希望對你有所幫助。
??從原因的分析看,這種方法只能存在手機有外部存儲的時候可以用,不過現(xiàn)在手機基本上都實現(xiàn)了SD內置本身就可以外部存儲,不用擔心這個。但是如果開發(fā)需求需要,存放在指定的文件夾怎么辦,那看方法二了。
2.方法二
??這種方法是我要實現(xiàn)一個圖片選擇器的時候,看到LuckSiege開源框架里的一個方法,也引發(fā)了我對FileProvider類的學習,之后對FileProvider進行總結。
創(chuàng)建文件和獲取uri分兩步:
??這樣就完美又靈活的實現(xiàn)了創(chuàng)建圖片文件。
二、從相冊獲取
調用系統(tǒng)相冊
Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, TAKE_ALBUM_REQUEST);@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);MLog.e("resultCode" + resultCode);if (resultCode == RESULT_CANCELED) {ToastUtil.showMessage(mContext, "取消設置圖片!");}if (resultCode == RESULT_OK) {switch (requestCode) {case TAKE_ALBUM_REQUEST:Uri uri = data.getData();// 獲取選擇圖片的uri// 對uri進行處理break;} }??調用系統(tǒng)圖片很簡單,不過一般系統(tǒng)圖片會非常大,直接顯示的時候,會報OOM。需要先進行壓縮或剪裁的處理。在壓縮或剪裁之前注意創(chuàng)建一個新的文件,處理后保存在新的文件里,否則就會處理后的圖就會覆蓋原圖片,并且有些手機覆蓋原圖的時候會報錯。
通過拍照、相冊獲取圖片demo
總結
以上是生活随笔為你收集整理的Android 拍照、从相册选择图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 丰田汽车 2023 上半年全球销量增长
- 下一篇: 梦幻西游化圣有啥好处