Android调用系统的相机,图库,以及裁剪图片功能。

原创 2015年07月08日 19:25:32

在开发中,调用系统的相机拍照,或者图库选择图片是很常见的操作,有时候你会看到有的应用在选择图片的时候,会有个小方框,可以进行图片的裁剪选择,其实,这些都可以通过调用系统来实现。

1:调用系统的相机拍照。

        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
在onActivityResult中,可以通过data来得到bitmap。

//      Bundle extras = data.getExtras();
//      Bitmap imageBitmap = (Bitmap) extras.get("data");
这个bitmap是个缩略图,意义不大,我们肯定希望能拿到拍照的原图。这个时候,需要传递一个File的实例,也就是照片保存的路径。

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {

            }
            if (photoFile != null) {
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));
                startActivityForResult(takePictureIntent, requestCode);
            }
        }
private File createImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        mCurrentPhotoPath = image.getAbsolutePath();
        Log.i(TAG,mCurrentPhotoPath);
        return image;
    }
其中,mCurrentPhotoPath就是拍照保存的路径,在onActivityResult中就可以获取图片,进行操作了。

2:调用系统的图库,选择图片。(在onActivityResult中通过URI来处理)

        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, requestCode);
Uri photoUri = data.getData();
                    if (photoUri != null) {
                        String[] proj = { MediaStore.Images.Media.DATA };
                        Cursor actualimagecursor = managedQuery(photoUri, proj,
                                null, null, null);
                        try {
                            int index = actualimagecursor
                                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                            actualimagecursor.moveToFirst();
                            String img_path = actualimagecursor.getString(index);
                            mCurrentPhotoPath = img_path;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

3:调用系统的裁剪:

有的app在选择用户头像的时候,可以进行裁剪,其实系统本身就自带了,就是在拍照完或者选择完图库后,通过Intent了实现的。

public void zoomPhoto(){
        Intent intent = new Intent("com.android.camera.action.CROP");
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        intent.setDataAndType(contentUri, "image/*");

        // crop为true是设置在开启的intent中设置显示的view可以剪裁
        intent.putExtra("crop", "true");

        // 设置不能改变裁减大小框
        intent.putExtra("scale", true);
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        // outputX,outputY 是剪裁图片的宽高
        intent.putExtra("outputX", 600);
        intent.putExtra("outputY", 600);

        // true:不返回uri,false:返回uri
        intent.putExtra("return-data", false);

        //保存裁剪的图片文件,在onActivityResult中返回的bitmap是个小的缩略图,三星测试的时候返回160*160的。
        //所有这里使用File保存,如知道原因或本人代码bug,请告知。谢谢。
        intent.putExtra("output", Uri.fromFile(tempFile));

        startActivityForResult(intent, REQUEST_CUT_PHOTO_SIZE);
    }

好了,通过上面的3段说明,已经可以在app中完成经常看到的需求了。

这个时候,你发现自己刚才拍的图片很不错,分享到朋友圈吧,让大家瞅瞅,然后打开微信,死活找不到这张图片,那是因为我们再onActivityResult中没有处理。在拍完照后,需要进行刷新。

    /**
     * 触发系统的Media Scanner,将我们的照片添加到Media Provider的数据库中,
     * 这样就可以使得Android相册程序与其他程序能够读取到这些照片
     */
    private void galleryAddPic() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }


这样,整个流程就都已经完成了,下面是需要注意的几个地方。

1:图片需要进行缩放操作,避免OOM。

2:网上有的说,在图库选择图片的时候,可以直接传递缩放的intent参数,在三星note3上,可以正常使用,但是在mx4的测试中,却出现了问题,不能正常打开裁剪界面,最后还是还拍照一样处理,就OK了。

3:startActivityForResult中,requestCode不能小于0,如果小于0,是不会调用onActivityResult方法的。

4:不要忘记清单文件中权限的添加,对内存卡进行了操作。


最后,附上一个.java的代码,里面包含了上面的代码,没有整个工程。Android调用系统的相机,图库,以及裁剪图片功能。





版权声明:本文为博主原创文章,未经博主允许不得转载。

Android调用系统图库和相机获取图片并裁剪

1、获取权限   2、点击按钮来提示选择图库还是相机 private String[]mCustomItems=new String[]{"本地相册","相机拍照"}; //显示选择相机,图库...
  • m0_37930105
  • m0_37930105
  • 2017年08月02日 15:20
  • 1596

【Android】调用系统图库获取图像并裁剪,安卓 4.4可用

最近实现调用系统图库获取图像并裁剪的功能,遇到很多问题,后面发现安卓4.4开始获取文件返回的路径不一样 几经波折终于搞定,感谢网上的大神们 下面贴出实现代码,安卓4.4以上或者以下系统都可用 ...
  • Haunt_
  • Haunt_
  • 2015年02月06日 16:50
  • 2263

Android调用系统相机和图库

Android调用系统相机和图库
  • first_hand
  • first_hand
  • 2016年04月14日 11:23
  • 3375

Android调用系统相机照片和裁剪

一、新建一个File对象来存储拍的照片:File outputFile = new File(Environment.getExternalStorageDirectory(),"aaaaaa.jpg...
  • arm_ok6410
  • arm_ok6410
  • 2016年05月11日 21:53
  • 1381

Android:调用系统图库/裁剪图片

开发中,调用系统图库和裁剪照片是很常见的需求。相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性能问题,等等。因此,对于一般的需求,建议直接调用系统的功能。...
  • books1958
  • books1958
  • 2014年12月19日 09:31
  • 3039

调用系统相机、图库并选择图片

相信很多学习android的朋友,都和我一样连一个简单的获取手机图片的无从知晓,于是借助于百度寻求帮助,于是乎有感写,这篇博客不仅仅是巩固自身的基础知识,希望能帮助到其他人。 Uri mPh...
  • yrmao9893
  • yrmao9893
  • 2016年07月29日 09:58
  • 960

调用相机拍照或者从图库里选择图片裁剪后设置到界面

拍照或者从相册中挑选图片设置头像是很常见的功能。同样是网上搜索了资料,知道了可以调用系统的功能实现,然后就试着开始写了。先是布局文件,就是一个ImageView和一个TextView。 ...
  • mouse12138
  • mouse12138
  • 2016年05月11日 15:44
  • 1780

安卓中选择系统图库的图片及调用相机的源码(原创)

在Android开发中经常会用到图片的上传功能,一般常用的是调用Android系统自带的图库及拍照功能。示例代码如下: 在MainActivity.java中 import java.io.ByteA...
  • fangmingzhmg
  • fangmingzhmg
  • 2016年01月25日 17:04
  • 1336

android使用系统裁剪图片

android系统自带的有裁剪图片功能,在应用过程中,碰到了诸多问题,在些做个记录: 代码如下,注释很详细,记得加写入sd卡数据的权限 public class MainActivity exte...
  • carlos1992
  • carlos1992
  • 2015年12月23日 15:26
  • 3153

Android调用相机实现拍照并裁剪图片,调用手机中的相册图片并裁剪图片

在 Android应用中,很多时候我们需要实现上哈村
  • li1500742101
  • li1500742101
  • 2014年04月22日 13:52
  • 6677
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android调用系统的相机,图库,以及裁剪图片功能。
举报原因:
原因补充:

(最多只允许输入30个字)