Android開發之從相簿選擇照片,

來源:互聯網
上載者:User

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/   





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.