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
原创粉丝点击