Android拍照、圖庫裁剪圖片(兼容版)

<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" />

源碼下載


發佈了28 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章