Android实现从相册选择照片功能

Rosalba ·
更新时间:2024-11-13
· 672 次阅读

本文实例为大家分享了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;     @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) {//从相册选择照片并裁切                 try {                     Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//将imageUri对象的图片加载到内存                     imgShow.setImageBitmap(bitmap);                 } catch (Exception e) {                     // TODO Auto-generated catch block                     e.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 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对象的图片加载到内存                     imgShow.setImageBitmap(bitmap);                 } catch (FileNotFoundException e) {                     // TODO Auto-generated catch block                     e.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 stub         Intent intent=new Intent();         intent.setAction(Intent.ACTION_PICK);//Pick an item from the data         intent.setType("image/*");//从所有图片中进行选择         startActivityForResult(intent, SELECT_ORIGINAL_PIC);         }     /**      * 从相册选择照片进行裁剪      */     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/*");//从所有图片中进行选择         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);//将裁切的结果输出到指定的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);//设置Action为拍照           intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI           startActivityForResult(intent, TAKE_ORIGINAL_PIC);       }         /**      * 从相机拍取照片进行裁剪      */     private void cropFromTake() {         // TODO Auto-generated method stub         Intent intent=new Intent();           intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照           intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI           startActivityForResult(intent, TAKE_PIC);       } }



照片 选择 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号