Android拍照、图库裁剪图片(兼容版)
来源:互联网 发布:美国非农就业数据9月 编辑:程序博客网 时间:2024/04/29 13:37
<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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {ImageUtils.openCameraImage(MainActivity.this);}});findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {ImageUtils.openGallery(MainActivity.this);}});}@Overrideprotected 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保存图片uriintent.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" />
源码下载
0 0
- Android拍照、图库裁剪图片(兼容版)
- 图库/拍照获取图片后裁剪处理(兼容4.4+)
- Android拍照或从图库选择图片并裁剪
- Android拍照或从图库选择图片并裁剪
- 拍照并裁剪,调用图库选择图片并裁剪
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- Android拍照、调用系统图库、裁剪图片到指定大小后输出
- Android拍照、调用系统图库、裁剪图片到指定大小后输出
- Android 从本地图库或拍照后裁剪图片并设置头像
- Android:调用系统图库/裁剪图片
- Android 调用相机或图库,裁剪图片
- Android调用系统图库并裁剪图片
- Android调用系统图库并裁剪图片
- Android拍照及图片裁剪、调用系统相册(兼容6.0以上权限处理及7.0以上文件管理)
- 拍照/选择图库头像/裁剪
- Android拍照及选择图片及裁剪及兼容6.0权限实现
- 灵活运用 SQL SERVER FOR XML PATH
- MVC4 无刷新分页!
- HTML点击事件重叠的处理
- EI 和 SCI 检索号查询
- jquery实现弹窗效果实例
- Android拍照、图库裁剪图片(兼容版)
- Picking, Registration, Reservation, Marking..What’s the Difference?
- 一个小白看Android与Java之间的关系
- leetcode之Evaluate Reverse Polish Notation
- java向数据库中插入数据,数据库乱码问题解决
- gson数据格式转化为对象或者集合等
- tableviewcell 自适应高度(模型数据自适应)
- C#中的Dictionary简介
- 检测App的内存占用和泄漏