开发中,调用系统图库和裁剪照片是很常见的需求。相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性能问题,等等。因此,对于一般的需求,建议直接调用系统的功能,简便高效!

首先上效果图:


一、只调用系统图库(不裁剪),返回用户选择的图片。(只支持单选,如需多选则需要自己实现,参考另一篇博文:Android:仿QQ照片选择器(按相册分类显示,多选添加))

1.跳转至系统图库页面:

Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(i, SELECT_IMAGE);
2.在onActivityResult中接收系统图库返回的信息(也就是用户选择的照片)。
 @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode != RESULT_OK || data == null) {            return;        }        //select an image        if (requestCode == SELECT_IMAGE) {      //get image path from uri      String imagePath = getImagePath(data.getData());            return;        }    }

private String getImagePath(Uri selectedImage) {        String[] filePathColumn = {MediaStore.Images.Media.DATA};        Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);        cursor.moveToFirst();        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);        String imagePath = cursor.getString(columnIndex);        cursor.close();        System.out.println("image path:" + imagePath);        return imagePath;    }

二、跳转至系统图库,选择照片,并裁剪。

1.跳转至系统图库:

//select image via system gallery, crop and save the new image file. public void selectImageAndCrop(View view) { //After cropping, the image file will be stored here! cacheFile = imageCacheFolder + File.separator + "cache_" + System.currentTimeMillis() + ".jpg"; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop", "true"); //width:height intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("output", Uri.fromFile(new File(cacheFile))); intent.putExtra("outputFormat", "JPEG"); startActivityForResult(Intent.createChooser(intent, "Choose Image"), SELECT_IMAGE_CROP); }
跳转之前需要传递的数据:

(1)crop:传递一个true,告诉系统需要裁剪。
(2)aspectX和aspectY:裁剪框的宽高比。
(3)output:需要传递一个由文件路径cacheFile构建的uri,用户在图库页面选择照片之后会自动进入裁剪页面,裁剪之后图片会被保存在cacheFile这个位置。

裁剪完成之后,同样会回调onActivityResult方法(resultCode为RESULT_OK),并且图片会被保存在cacheFile这个位置,因此可以直接使用这个文件,例如将其设置为ImageView的资源。

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode != RESULT_OK) {            return;        }        //select an image and crop        if (requestCode == SELECT_IMAGE_CROP) {      //compress the original image to save memory.   BitmapFactory.Options opt = new BitmapFactory.Options();   opt.inSampleSize = 4;      imageView.setImageBitmap(BitmapFactory.decodeFile(cacheFile, opt));        }    }

更多相关文章

  1. 从 0 开始,搭建一个完整的 Android(安卓)音视频通信系统
  2. 浅析Android(安卓)4.0的通知系统(附Android(安卓)4.0设计指南全文
  3. 与ios相比,android为什么越用越卡
  4. IOS ANDROID WINDOWS PHONE国内格局的悄然变化-应用电台www.apph
  5. [置顶] Android中调用系统相机、系统相册来获取图片,并裁剪图片。
  6. Android(安卓)非技术问题硬知识点整理
  7. 纪念一下坑爹的蓝牙扫描枪连接(Android外接输入设备)
  8. Android7.1.2源码解析系列】Android编译系统翻译------Android_B
  9. Android(安卓)4.0 消息广播无法接收的原因

随机推荐

  1. Android(安卓)不能生成R文件,gen目录为空
  2. android代码混淆后gson无法解析问题
  3. android之PopUpWindow显示Listview(文件列
  4. Android(安卓)隐藏显示StartBar
  5. android install location
  6. Andrdoid Sensors Overview (探测器概述)
  7. Customize "share picture via" menu on
  8. category
  9. Android(安卓)View随手指移动
  10. fragment