Android實(shí)現(xiàn)從相冊(cè)選擇照片功能
本文實(shí)例為大家分享了Android實(shí)現(xiàn)從相冊(cè)選擇照片功能的具體代碼,供大家參考,具體內(nèi)容如下
之前在 《Android開發(fā)之裁剪照片》一文中介紹過,如何從相冊(cè)選取照片和拍攝照片并進(jìn)行裁切,在本篇中主要向介紹從相冊(cè)選擇原生照片(不裁切)。
第一步:向系統(tǒng)發(fā)送選擇照片的意圖。
/** ?* 從相冊(cè)選擇原生的照片(不裁切) ?*/ private void selectFromGallery() { ? ? // TODO Auto-generatedmethod stub ? ? Intentintent=new Intent(); ? ? intent.setAction(Intent.ACTION_PICK);//Pick an item fromthe data ? ? intent.setType("image/*");//從所有圖片中進(jìn)行選擇 ? ? startActivityForResult(intent, SELECT_ORIGINAL_PIC); ?? }
第二步:處理系統(tǒng)返回的結(jié)果。
switch (requestCode) { case SELECT_ORIGINAL_PIC: ? ? if (resultCode==RESULT_OK) {//從相冊(cè)選擇照片不裁切 ? ? ? ?try { ? ? ? ? ? ?Uri selectedImage = data.getData(); //獲取系統(tǒng)返回的照片的Uri ? ? ? ? ? ?String[] filePathColumn = { MediaStore.Images.Media.DATA };? ? ? ? ? ? ?Cursor cursor =getContentResolver().query(selectedImage,? ? ? ? ? ? ? ? ? ? filePathColumn, null, null, null);//從系統(tǒng)表中查詢指定Uri對(duì)應(yīng)的照片 ? ? ? ? ? ?cursor.moveToFirst();? ? ? ? ? ? ?int columnIndex = cursor.getColumnIndex(filePathColumn[0]); ? ? ? ? ? ?String picturePath = cursor.getString(columnIndex); ?//獲取照片路徑 ? ? ? ? ? ?cursor.close();? ? ? ? ? ? ?Bitmap bitmap= BitmapFactory.decodeFile(picturePath); ? ? ? ? ? ?imgShow.setImageBitmap(bitmap); ? ? ? ?} catch (Exception e) { ? ? ? ? ? ?// TODO Auto-generatedcatch block ? ? ? ? ? ?e.printStackTrace(); ? ? ? ?} ? ? } ? ? break; }
代碼說明:
當(dāng)向系統(tǒng)發(fā)送選擇照片的意圖后,系統(tǒng)或啟動(dòng)相冊(cè)管理程序,讓用戶來選擇照片,選取好照片之后,系統(tǒng)會(huì)返回一個(gè)選擇照片的Uri,為了獲取Uri對(duì)應(yīng)的照片的絕對(duì)路徑,我們需要向系統(tǒng)的媒體數(shù)據(jù)框中查找指定Uri對(duì)應(yīng)的圖片路徑。獲取到圖片的絕對(duì)路徑之后,我們就可以做一些操作,比如,將它設(shè)置到ImageVew上,上傳到網(wǎng)絡(luò)上等。
最后附上項(xiàng)目完整代碼:
package com.jph.cp; ? import java.io.File; import java.io.FileNotFoundException; import android.support.v7.app.ActionBarActivity; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.widget.ImageView; ? /** ?* 從相冊(cè)選擇照片進(jìn)行裁剪,從相機(jī)拍取照片進(jìn)行裁剪<br> ?* 從相冊(cè)選擇照片(不裁切),并獲取照片的路徑<br> ?* 拍取照片(不裁切),并獲取照片路徑 ?* @author JPH ?* Date:2014.10.09 ?* last modified:2014.11.04 ?*/ public class MainActivity extends ActionBarActivity { ?? ?/**request Code 從相冊(cè)選擇照片并裁切**/ ?? ?private final static int SELECT_PIC=123;? ?? ?/**request Code 從相冊(cè)選擇照片不裁切**/ ?? ?private final static int SELECT_ORIGINAL_PIC=126;? ?? ?/**request Code 拍取照片并裁切**/ ?? ?private final static int TAKE_PIC=124;? ?? ?/**request Code 拍取照片不裁切**/ ?? ?private final static int TAKE_ORIGINAL_PIC=127;? ?? ?/**request Code 裁切照片**/ ?? ?private final static int CROP_PIC=125;? ?? ?private Uri imageUri; ?? ?private ImageView imgShow; ?? ?@Override ?? ?protected void onCreate(Bundle savedInstanceState) { ?? ??? ?super.onCreate(savedInstanceState); ?? ??? ?setContentView(R.layout.activity_main); ?? ??? ?//初始化imageUri ?? ??? ?imageUri=Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "test.jpg")); ?? ??? ?imgShow=(ImageView)findViewById(R.id.imgShow); ?? ?} ?? ?@Override ?? ?protected void onActivityResult(int requestCode, int resultCode, Intent data) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?switch (requestCode) { ?? ??? ?case SELECT_PIC: ?? ??? ??? ?if (resultCode==RESULT_OK) {//從相冊(cè)選擇照片并裁切 ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//將imageUri對(duì)象的圖片加載到內(nèi)存 ?? ??? ??? ??? ??? ?imgShow.setImageBitmap(bitmap); ?? ??? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case SELECT_ORIGINAL_PIC: ?? ??? ??? ?if (resultCode==RESULT_OK) {//從相冊(cè)選擇照片不裁切 ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?Uri selectedImage = data.getData(); //獲取系統(tǒng)返回的照片的Uri? ?? ??? ??? ??? ??? ?String[] filePathColumn = { MediaStore.Images.Media.DATA }; ? ?? ??? ??? ??? ??? ?Cursor cursor = getContentResolver().query(selectedImage, ? ?? ??? ??? ??? ??? ??? ??? ?filePathColumn, null, null, null);//從系統(tǒng)表中查詢指定Uri對(duì)應(yīng)的照片 ?? ??? ??? ??? ??? ?cursor.moveToFirst(); ? ?? ??? ??? ??? ??? ?int columnIndex = cursor.getColumnIndex(filePathColumn[0]);? ?? ??? ??? ??? ??? ?String picturePath = cursor.getString(columnIndex); ?//獲取照片路徑 ?? ??? ??? ??? ??? ?cursor.close(); ? ?? ??? ??? ??? ??? ?Bitmap bitmap= BitmapFactory.decodeFile(picturePath); ?? ??? ??? ??? ??? ?imgShow.setImageBitmap(bitmap); ?? ??? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case TAKE_PIC://拍取照片,并裁切 ?? ??? ??? ?if (resultCode==RESULT_OK) { ?? ??? ??? ??? ?cropImageUri(imageUri, 600, 600, CROP_PIC); ?? ??? ??? ?} ?? ??? ?case TAKE_ORIGINAL_PIC://拍取照片 ?? ??? ??? ?if (resultCode==RESULT_OK) { ?? ??? ??? ??? ?String imgPath=imageUri.getPath();//獲取拍攝照片路徑 ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case CROP_PIC://拍取照片 ?? ??? ??? ?if (resultCode==RESULT_OK) { ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver(). ?? ??? ??? ??? ??? ??? ??? ?openInputStream(imageUri));//將imageUri對(duì)象的圖片加載到內(nèi)存 ?? ??? ??? ??? ??? ?imgShow.setImageBitmap(bitmap); ?? ??? ??? ??? ?} catch (FileNotFoundException e) { ?? ??? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?default: ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?super.onActivityResult(requestCode, resultCode, data); ?? ?} ?? ?/** ?? ? * 裁剪指定uri對(duì)應(yīng)的照片 ?? ? * @param imageUri:uri對(duì)應(yīng)的照片 ?? ? * @param outputX:裁剪寬 ?? ? * @param outputY:裁剪高 ?? ? * @param requestCode:請(qǐng)求碼 ?? ? */ ?? ?private void cropImageUri(Uri imageUri, int outputX, int outputY, int requestCode){ ?? ? ? ?Intent intent = new Intent("com.android.camera.action.CROP"); ?? ? ? ?intent.setDataAndType(imageUri, "image/*"); ?? ? ? ?intent.putExtra("crop", "true"); ?? ? ? ?intent.putExtra("aspectX", 1); ?? ? ? ?intent.putExtra("aspectY", 1); ?? ? ? ?intent.putExtra("outputX", outputX); ?? ? ? ?intent.putExtra("outputY", outputY); ?? ? ? ?intent.putExtra("scale", true); ?? ? ? ?intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); ?? ? ? ?intent.putExtra("return-data", false); ?? ? ? ?intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); ?? ? ? ?intent.putExtra("noFaceDetection", true); // no face detection ?? ? ? ?startActivityForResult(intent, requestCode); ?? ?} ? ?? ?public void cropPic(View view) { ?? ??? ?switch (view.getId()) { ?? ??? ?case R.id.btnCropFromGallery://從相冊(cè)選擇照片進(jìn)行裁剪 ?? ??? ??? ?cropFromGallery(); ?? ??? ??? ?break; ?? ??? ?case R.id.btnCropFromTake://從相機(jī)拍取照片進(jìn)行裁剪 ?? ??? ??? ?cropFromTake(); ?? ??? ??? ?break; ?? ??? ?case R.id.btnOriginal://從相冊(cè)選擇照片不裁切 ?? ??? ??? ?selectFromGallery(); ?? ??? ??? ?break; ?? ??? ?case R.id.btnTakeOriginal://從相機(jī)拍取照片不裁剪 ?? ??? ??? ?selectFromTake(); ?? ??? ??? ?break; ? ?? ??? ?default: ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?/** ?? ? * 從相冊(cè)選擇原生的照片(不裁切) ?? ? */ ?? ?private void selectFromGallery() { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?Intent intent=new Intent(); ?? ??? ?intent.setAction(Intent.ACTION_PICK);//Pick an item from the data ?? ??? ?intent.setType("image/*");//從所有圖片中進(jìn)行選擇 ?? ??? ?startActivityForResult(intent, SELECT_ORIGINAL_PIC); ? ? ?? ?} ?? ?/** ?? ? * 從相冊(cè)選擇照片進(jìn)行裁剪 ?? ? */ ?? ?private void cropFromGallery() { ?? ??? ?// TODO Auto-generated method stub?? ??? ? ?? ??? ?Intent intent=new Intent(); ?? ??? ?intent.setAction(Intent.ACTION_PICK);//Pick an item from the data ?? ??? ?intent.setType("image/*");//從所有圖片中進(jìn)行選擇 ?? ??? ?intent.putExtra("crop", "true");//設(shè)置為裁切 ?? ??? ?intent.putExtra("aspectX", 1);//裁切的寬比例 ?? ??? ?intent.putExtra("aspectY", 1);//裁切的高比例 ?? ??? ?intent.putExtra("outputX", 600);//裁切的寬度 ?? ??? ?intent.putExtra("outputY", 600);//裁切的高度 ?? ??? ?intent.putExtra("scale", true);//支持縮放 ?? ??? ?intent.putExtra("return-data", false); ?? ??? ?intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將裁切的結(jié)果輸出到指定的Uri ?? ??? ?intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//裁切成的圖片的格式 ?? ??? ?intent.putExtra("noFaceDetection", true); // no face detection ?? ??? ?startActivityForResult(intent, SELECT_PIC); ? ? ?? ?} ?? ?/** ?? ? * 拍取照片不裁切 ?? ? */ ?? ?private void selectFromTake() { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?Intent intent=new Intent(); ? ?? ??? ?intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設(shè)置Action為拍照 ? ?? ??? ?intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將拍取的照片保存到指定URI ? ?? ??? ?startActivityForResult(intent, TAKE_ORIGINAL_PIC); ? ?? ?}?? ? ?? ?/** ?? ? * 從相機(jī)拍取照片進(jìn)行裁剪 ?? ? */ ?? ?private void cropFromTake() { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?Intent intent=new Intent(); ? ? ? ? ? intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設(shè)置Action為拍照 ? ? ? ? ? intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將拍取的照片保存到指定URI ? ? ? ? ? startActivityForResult(intent, TAKE_PIC); ? ?? ?} }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)之圖形圖像與動(dòng)畫(三)Animation效果的XML實(shí)現(xiàn)
使用XML來定義Tween Animation動(dòng)畫的XML文件在工程中res/anim目錄,這個(gè)文件必須包含一個(gè)根元素,感興趣的友可以了解一下,希望本文對(duì)你有所幫助2013-01-01詳解android 視頻圖片混合輪播實(shí)現(xiàn)
這篇文章主要介紹了android 視頻圖片混合輪播實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Android SharedPreferences存儲(chǔ)用法詳解
這篇文章主要為大家詳細(xì)介紹了Android SharedPreferences存儲(chǔ)用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02android操作SQLite增刪改減實(shí)現(xiàn)代碼
android操作SQLite增刪改減實(shí)現(xiàn)代碼,學(xué)習(xí)android的朋友可以參考下。2010-11-11android 使用OkHttp上傳多張圖片的實(shí)現(xiàn)代碼
這篇文章主要介紹了android 使用OkHttp上傳多張圖片的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Android SurfaceView拍照錄像實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android SurfaceView拍照錄像實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android使用自定義屬性實(shí)現(xiàn)圖片自動(dòng)播放滾動(dòng)的功能
這篇文章主要介紹了Android使用自定義屬性實(shí)現(xiàn)圖片自動(dòng)播放滾動(dòng)的功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Android compose氣泡升起和水滴下墜動(dòng)畫實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Android compose氣泡升起和水滴下墜動(dòng)畫實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01