Android開發之從相簿選擇照片,
Android開發之從相簿選擇照片
請尊重他人的勞動成果,轉載請註明出處:Android開發之從相簿選擇照片
我曾在 《Android開發之裁剪照片》一文中介紹過,如何從相簿選取照片和拍攝照片並進行裁切,在本篇中主要向介紹從相簿選擇原生照片(不裁切)。
第一步:向系統發送選擇照片的意圖。
/** * 從相簿選擇原生的照片(不裁切) */private void selectFromGallery() { // TODO Auto-generatedmethod stub Intentintent=new Intent(); intent.setAction(Intent.ACTION_PICK);//Pick an item fromthe data intent.setType("image/*");//從所有圖片中進行選擇 startActivityForResult(intent, SELECT_ORIGINAL_PIC); }
第二步:處理系統返回的結果。
switch (requestCode) {case SELECT_ORIGINAL_PIC: if (resultCode==RESULT_OK) {//從相簿選擇照片不裁切 try { Uri selectedImage = data.getData(); //擷取系統返回的照片的Uri String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor =getContentResolver().query(selectedImage, filePathColumn, null, null, null);//從系統資料表中查詢指定Uri對應的照片 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;}
代碼說明:
當向系統發送選擇照片的意圖後,系統或啟動相簿管理程式,讓使用者來選擇照片,選取好照片之後,系統會返回一個選擇照片的Uri,為了擷取Uri對應的照片的絕對路徑,我們需要向系統的媒體資料框中尋找指定Uri對應的圖片路徑。擷取到圖片的絕對路徑之後,我們就可以做一些操作,比如,將它設定到ImageVew上,上傳到網路上等。
最後附上項目完整代碼:
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;/** * 從相簿選擇照片進行裁剪,從相機拍取照片進行裁剪<br> * 從相簿選擇照片(不裁切),並擷取照片的路徑<br> * 拍取照片(不裁切),並擷取照片路徑 * @author JPH * Date:2014.10.09 * last modified:2014.11.04 */public class MainActivity extends ActionBarActivity {/**request Code 從相簿選擇照片並裁切**/private final static int SELECT_PIC=123; /**request Code 從相簿選擇照片不裁切**/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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化imageUriimageUri=Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "test.jpg"));imgShow=(ImageView)findViewById(R.id.imgShow);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubswitch (requestCode) {case SELECT_PIC:if (resultCode==RESULT_OK) {//從相簿選擇照片並裁切try {Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//將imageUri對象的圖片載入到記憶體imgShow.setImageBitmap(bitmap);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case SELECT_ORIGINAL_PIC:if (resultCode==RESULT_OK) {//從相簿選擇照片不裁切try {Uri selectedImage = data.getData(); //擷取系統返回的照片的Uri String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);//從系統資料表中查詢指定Uri對應的照片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 blocke.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對象的圖片載入到記憶體imgShow.setImageBitmap(bitmap);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;default:break;}super.onActivityResult(requestCode, resultCode, data);}/** * 裁剪指定uri對應的照片 * @param imageUri:uri對應的照片 * @param outputX:裁剪寬 * @param outputY:裁剪高 * @param requestCode:請求碼 */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://從相簿選擇照片進行裁剪cropFromGallery();break;case R.id.btnCropFromTake://從相機拍取照片進行裁剪cropFromTake();break;case R.id.btnOriginal://從相簿選擇照片不裁切selectFromGallery();break;case R.id.btnTakeOriginal://從相機拍取照片不裁剪selectFromTake();break;default:break;}}/** * 從相簿選擇原生的照片(不裁切) */private void selectFromGallery() {// TODO Auto-generated method stubIntent intent=new Intent();intent.setAction(Intent.ACTION_PICK);//Pick an item from the dataintent.setType("image/*");//從所有圖片中進行選擇startActivityForResult(intent, SELECT_ORIGINAL_PIC); }/** * 從相簿選擇照片進行裁剪 */private void cropFromGallery() {// TODO Auto-generated method stubIntent intent=new Intent();intent.setAction(Intent.ACTION_PICK);//Pick an item from the dataintent.setType("image/*");//從所有圖片中進行選擇intent.putExtra("crop", "true");//設定為裁切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);//將裁切的結果輸出到指定的Uriintent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//裁切成的圖片的格式intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, SELECT_PIC); }/** * 拍取照片不裁切 */private void selectFromTake() {// TODO Auto-generated method stubIntent intent=new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設定Action為拍照 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將拍取的照片儲存到指定URI startActivityForResult(intent, TAKE_ORIGINAL_PIC); }/** * 從相機拍取照片進行裁剪 */private void cropFromTake() {// TODO Auto-generated method stubIntent intent=new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設定Action為拍照 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將拍取的照片儲存到指定URI startActivityForResult(intent, TAKE_PIC); }}
如果你覺得這篇博文對你有協助的話,請為這篇博文點個贊吧!也可以關注fengyuzhengfan的部落格,收看更多精彩!http://blog.csdn.net/fengyuzhengfan/