Android拍照、图库裁剪图片(兼容版)

原创 2015年11月18日 14:27:24

<p>一个简单的Android拍照、图库、裁剪示例,兼容华为、三星手机</p><p>先看Mainactivity</p>
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView iv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		iv = (ImageView) findViewById(R.id.iv);

		findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				ImageUtils.openCameraImage(MainActivity.this);
			}
		});
		findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				ImageUtils.openGallery(MainActivity.this);
			}
		});
	}


	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_CANCELED) {
			return;
		}

		switch (requestCode) {
		// 拍照获取图片
		case ImageUtils.GET_IMAGE_BY_CAMERA:
			
			// 自定义Uri(ImageUtils.imageUriFromCamera),用于保存拍照后图片地址
			if (ImageUtils.imageUriFromCamera != null) {
				// 可以直接显示图片,或者进行其他处理(如压缩或裁剪等)
				// iv.setImageURI(ImageUtils.imageUriFromCamera);
				// 对图片进行裁剪
				ImageUtils.cropImage(this, ImageUtils.imageUriFromCamera);
				break;
			}

			break;
		// 手机相册获取图片
		case ImageUtils.GET_IMAGE_FROM_PHONE:
			if (data != null && data.getData() != null) {
				
				// 可以直接显示图片,或者进行其他处理(如压缩或裁剪等)
				// iv.setImageURI(data.getData());

				// 对图片进行裁剪
				ImageUtils.cropImage(this, data.getData());
			}
			break;
			
		// 裁剪图片后结果
		case ImageUtils.CROP_IMAGE:
			if (ImageUtils.cropImageUri != null) {
				// 可以直接显示图片,或者进行其他处理(如压缩等)
				iv.setImageURI(ImageUtils.cropImageUri);
			}
			break;
		}
	}
}

ImageUtils类

mport java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;

public class ImageUtils {

	public static final int GET_IMAGE_BY_CAMERA = 5001;
	public static final int GET_IMAGE_FROM_PHONE = 5002;
	public static final int CROP_IMAGE = 5003;
	public static Uri imageUriFromCamera;
	public static Uri cropImageUri;

	public static void openCameraImage(final Activity activity) {
		ImageUtils.imageUriFromCamera = ImageUtils.createImagePathUri(activity);

		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		// MediaStore.EXTRA_OUTPUT参数不设置时,系统会自动生成一个uri,但是只会返回一个缩略图
		// 返回图片在onActivityResult中通过以下代码获取
		// Bitmap bitmap = (Bitmap) data.getExtras().get("data");
		intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUtils.imageUriFromCamera);
		activity.startActivityForResult(intent, ImageUtils.GET_IMAGE_BY_CAMERA);
	}

	/**
	 * 打开图库
	 */
	public static void openGallery2(final Activity activity) {
		Intent intent = new Intent();
		intent.setType("image/*");
		intent.setAction(Intent.ACTION_GET_CONTENT);
		activity.startActivityForResult(intent, ImageUtils.GET_IMAGE_FROM_PHONE);
	}

	/**
	 * 打开图库-兼容华为
	 */
	public static void openGallery(final Activity activity) {

		Intent intent = new Intent(Intent.ACTION_PICK);
		intent.setType("image/*");
		activity.startActivityForResult(intent, ImageUtils.GET_IMAGE_FROM_PHONE);
	}

	public static void cropImage(Activity activity, Uri srcUri) {
		ImageUtils.cropImageUri = ImageUtils.createImagePathUri(activity);

		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(srcUri, "image/*");
		intent.putExtra("crop", "true");

		// aspectX aspectY 是裁剪框宽高的比例(0-不保持比例)
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪后生成图片的宽高
		// intent.putExtra("outputX", 300);
		// intent.putExtra("outputY", 100);

		// return-data为true时,会直接返回bitmap数据,但是大图裁剪时会出现问题,推荐下面为false时的方式
		// return-data为false时,不会返回bitmap,但需要指定一个MediaStore.EXTRA_OUTPUT保存图片uri
		intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUtils.cropImageUri);
		intent.putExtra("return-data", false);

		activity.startActivityForResult(intent, CROP_IMAGE);
	}

	/**
	 * 创建一条图片地址uri,用于保存拍照后的照片
	 * 
	 * @param context
	 * @return 图片的uri
	 */
	private static Uri createImagePathUri(Context context) {
		Uri imageFilePath = null;
		String status = Environment.getExternalStorageState();
		SimpleDateFormat timeFormatter = new SimpleDateFormat(
				"yyyyMMdd_HHmmss", Locale.CHINA);
		long time = System.currentTimeMillis();
		String imageName = timeFormatter.format(new Date(time));
		// ContentValues是我们希望这条记录被创建时包含的数据信息
		ContentValues values = new ContentValues(3);
		values.put(MediaStore.Images.Media.DISPLAY_NAME, imageName);
		values.put(MediaStore.Images.Media.DATE_TAKEN, time);
		values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
		if (status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储
			imageFilePath = context.getContentResolver().insert(
					MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
		} else {
			imageFilePath = context.getContentResolver().insert(
					MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
		}
		Log.i("", "生成的照片输出路径:" + imageFilePath.toString());
		return imageFilePath;
	}

}

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    android:background="@android:color/white"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn"
        android:text="拍照"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    <Button
        android:id="@+id/btn2"
        android:text="图库"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    
    <ImageView
        android:id="@+id/iv"
        android:background="@android:color/black"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />

</LinearLayout>

最后还有权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

源码下载


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

Android 使用intent对Bitmap的处理(拍照、裁剪、从图库选择)

原文地址: 上:http://blog.csdn.net/floodingfire/article/details/8144604 zho
  • u010932852
  • u010932852
  • 2014年10月27日 21:24
  • 684

Android 拍照和选择图库的demo(兼容7.0)

Android 拍照和选择图库的demo(兼容7.0)
  • ANDROID_WangWeiDa
  • ANDROID_WangWeiDa
  • 2017年11月20日 21:20
  • 421

Android 调用系统拍照及相册裁剪后作为头像,兼容到5.0

上周做了一个头像主要是为了抽出来封装一下,因为99%的应用都需要个人头像的上进行裁剪然后作为头像.所以考虑到这部分的需求,所以要解耦,为了代码的阅读性,扩展性等.      大家都知道调用系统相机和...
  • u010316858
  • u010316858
  • 2015年11月16日 15:19
  • 2515

一个简单的Android图片处理Demo

功能:Android中常用的图片选择(相册、拍照)与处理(贴图、滤镜、裁剪、旋转、保存) 先上几张Demo的运行截图吧         Demo下载链接,我是传送门 引用步...
  • yzx0xyz
  • yzx0xyz
  • 2015年07月30日 18:25
  • 2260

Android 7.0下拍照和裁剪图片

Android 7.0下拍照和裁剪图片最近,公司的APP集中爆发了头像上传中拍照或照片裁剪的bug,让我才意识到及时学习Android新特性是多么重要,一个过去式的APP是无法一直满足日益变化的新需求...
  • Runwx
  • Runwx
  • 2017年07月12日 15:51
  • 2841

Android拍照及选择图片及裁剪及兼容6.0权限实现

来到新公司接手项目之后,测试总是给我测出拍照,选择图片,裁剪的各种bug,比如换个手机就不行了,或者换个6.0的系统就不行了等等这样的问题,因为这个代码是之前的一个同事写的,代码很乱,改来改去,硬是没...
  • qq_23383563
  • qq_23383563
  • 2016年10月19日 17:09
  • 2536

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

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

Android拍照 图库照片本地显示

package com.example.photodemo; import java.io.File; import java.io.FileNotFoundException; impor...
  • Ti_wj
  • Ti_wj
  • 2016年06月02日 10:01
  • 141

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

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

Android7.0适配心得(一)_拍照兼容

一、在Android7.0上调用系统相机拍照,裁切照片的适配 在Android7.0之前,如果你想调用系统相机拍照可以通过以下代码来进行:File file = new File(Environme...
  • u010302765
  • u010302765
  • 2017年12月04日 13:37
  • 274
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android拍照、图库裁剪图片(兼容版)
举报原因:
原因补充:

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