拍照、拍照裁剪

拍照、拍照裁剪_第1张图片

感谢一下harvic大神,,,

*******************************只拍照***************************************

activity_main.xml

<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:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_camera_only"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="仅拍照"/>

    <ImageView
        android:id="@+id/image_result"
        android:layout_width="200dip"
        android:layout_height="200dip"
        android:scaleType="centerInside"
        android:layout_gravity="center_horizontal"/>

</LinearLayout>
在配置文件里面,android:hardwareAccelerated="false"填上这个属性,这样拍照后,返回在控件那块会显示拍照返回的图片(或者可以用主界面activity里面注释的代码实现)
 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="false">

MainActivity

package com.harvic.blogcameraonly;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private static final int RESULT_CAMERA_ONLY = 100;
	private ImageView mImage;
	private Uri imageUri;

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

		// 获取SD卡目录地址
		String path = getSDCardPath();
		// 根据路径名字,创建File实例对象
		File file = new File(path + "/temp.jpg");
		// 通过File实例,获取存放图片的Uri地址
		imageUri = Uri.fromFile(file);

		// 拍照完毕后,需要设置图片的控件id
		mImage = (ImageView) findViewById(R.id.image_result);
		Button btn_take_camera_only = (Button) findViewById(R.id.btn_camera_only);
		btn_take_camera_only.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				takeCameraOnly();
			}
		});
	}

	/**
	 * 进行拍照处理操作
	 */
	private void takeCameraOnly() {
		Intent intent = null;
		// 然后通过MediaStore.ACTION_IMAGE_CAPTURE来隐式调起拍照Intent
		intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		/**
		 * return-data:是将结果保存在data中返回,在onActivityResult中
		 * 直接调用intent.getdata()就可以获取值了,这里设为fase,就是不让它保存在data中
		 */
		intent.putExtra("return-data", false);
		/**
		 * 由于我们不让它保存在Intent的data域中,但我们总要有地方来保存我们的图片啊
		 * 这个参数就是转移保存地址的,对应Value中保存的URI就是指定的保存地址
		 */
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
		// 图片输出格式
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		// noFaceDetection boolean 是否取消人脸识别功能
		intent.putExtra("noFaceDetection", true);
		startActivityForResult(intent, RESULT_CAMERA_ONLY);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		/**
		 * onActivityResult()方法中的第二个参数resultCode还有系统自带的一些参数
		 * 也就是说,如果我们启动的intent是隐式意图,那么可以用Activity类中RESULT_OK来表示操作已经顺利结束。
		 */
		if (resultCode != Activity.RESULT_OK)
			return;
		switch (requestCode) {
		case RESULT_CAMERA_ONLY: {
			try {
				// 用个cursor把Uri指向的图片信息查找(query)出来
				// Bitmap bitmap =
				// BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
				// Bitmap setScaleBitmap = setScaleBitmap(bitmap,2);
				// mImage.setImageBitmap(setScaleBitmap);

				Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
						.openInputStream(imageUri));
				mImage.setImageBitmap(bitmap);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
			break;

		}
	}

	// private Bitmap setScaleBitmap(Bitmap photo,int SCALE) {
	// if (photo != null) {
	// Bitmap smallBitmap = zoomBitmap(photo, photo.getWidth() / SCALE,
	// photo.getHeight() / SCALE);
	// //释放原始图片占用的内存,防止out of memory异常发生
	// photo.recycle();
	// return smallBitmap;
	// }
	// return null;
	// }
	//
	// public Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
	// int w = bitmap.getWidth();
	// int h = bitmap.getHeight();
	// Matrix matrix = new Matrix();
	// float scaleWidth = ((float) width / w);
	// float scaleHeight = ((float) height / h);
	// matrix.postScale(scaleWidth, scaleHeight);// 利用矩阵进行缩放不会造成内存溢出
	// Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
	// return newbmp;
	// }

	public static String getSDCardPath() {
		String cmd = "cat/proc/mounts";
		Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象
		try {
			Process p = run.exec(cmd);// 启动另一个进程来执行命令
			BufferedInputStream in = new BufferedInputStream(p.getInputStream());
			BufferedReader inBr = new BufferedReader(new InputStreamReader(in));

			String lineStr;
			while ((lineStr = inBr.readLine()) != null) {
				// 获得命令执行后在控制台的输出信息
				if (lineStr.contains("sdcard")
						&& lineStr.contains(".android_secure")) {
					String[] strArray = lineStr.split(" ");
					if (strArray != null && strArray.length >= 5) {
						String result = strArray[1].replace("/.android_secure",
								"");
						return result;
					}
				}
				// 检查命令是否执行失败。
				if (p.waitFor() != 0 && p.exitValue() == 1) {
					// p.exitValue()==0表示正常结束,1:非正常结束
				}
			}
			inBr.close();
			in.close();
		} catch (Exception e) {

			return Environment.getExternalStorageDirectory().getPath();
		}

		return Environment.getExternalStorageDirectory().getPath();
	}
}

***************************************拍照、裁剪***************************************************

AndroidManifest.xml和布局文件不变

MainActivity

package com.harvic.blogcameracropfinally;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

public class MainActivity extends Activity {
	private static final int RESULT_CAMERA_ONLY = 100;
	private static final int RESULT_CAMERA_CROP_PATH_RESULT = 301;
	private ImageView mImage;
	private Uri imageUri;
	private Uri imageCropUri;

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

		String path = getSDCardPath();
		// 获取拍照的图片路径地址信息
		File file = new File(path + "/temp.jpg");
		// 获取图片存放Uri地址路径信息
		imageUri = Uri.fromFile(file);
		// 获取图片裁剪的路径信息
		File cropFile = new File(getSDCardPath() + "/temp_crop.jpg");
		// 获取图片裁剪后的Uri地址路径信息
		imageCropUri = Uri.fromFile(cropFile);

		mImage = (ImageView) findViewById(R.id.image_result);
		Button btn_take_camera_only = (Button) findViewById(R.id.btn_camera_only);
		btn_take_camera_only.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				takeCameraOnly();
			}
		});
	}

	private void takeCameraOnly() {
		Intent intent = null;
		intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// action is
																// capture
		intent.putExtra("return-data", false);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("noFaceDetection", true);
		startActivityForResult(intent, RESULT_CAMERA_ONLY);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode != Activity.RESULT_OK)
			return;
		switch (requestCode) {
		case RESULT_CAMERA_ONLY: {
			/**
			 * 在接收到返回的消息后,调起裁剪Intent: 将传进去的uri做为源数据,即被裁剪的数据,将结果存储在imageCropUri中;
			 */
			cropImg(imageUri);
		}
			break;
		case RESULT_CAMERA_CROP_PATH_RESULT: {
			Bundle extras = data.getExtras();
			if (extras != null) {
				try {
					Bitmap bitmap = BitmapFactory
							.decodeStream(getContentResolver().openInputStream(
									imageCropUri));
					mImage.setImageBitmap(bitmap);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
			break;
		}
	}

	public void cropImg(Uri uri) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		intent.putExtra("crop", "true");
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		intent.putExtra("outputX", 700);
		intent.putExtra("outputY", 700);
		intent.putExtra("return-data", false);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("noFaceDetection", true);
		startActivityForResult(intent, RESULT_CAMERA_CROP_PATH_RESULT);
	}

	/**
	 * 获取SD卡的目录地址信息
	 */
	public static String getSDCardPath() {
		String cmd = "cat /proc/mounts";
		Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象
		try {
			Process p = run.exec(cmd);// 启动另一个进程来执行命令
			BufferedInputStream in = new BufferedInputStream(p.getInputStream());
			BufferedReader inBr = new BufferedReader(new InputStreamReader(in));

			String lineStr;
			while ((lineStr = inBr.readLine()) != null) {
				// 获得命令执行后在控制台的输出信息
				if (lineStr.contains("sdcard")
						&& lineStr.contains(".android_secure")) {
					String[] strArray = lineStr.split(" ");
					if (strArray != null && strArray.length >= 5) {
						String result = strArray[1].replace("/.android_secure",
								"");
						return result;
					}
				}
				// 检查命令是否执行失败。
				if (p.waitFor() != 0 && p.exitValue() == 1) {
					// p.exitValue()==0表示正常结束,1:非正常结束
				}
			}
			inBr.close();
			in.close();
		} catch (Exception e) {

			return Environment.getExternalStorageDirectory().getPath();
		}

		return Environment.getExternalStorageDirectory().getPath();
	}
}



你可能感兴趣的:(crop,MediaStore,FromFile,noFaceDetection,CompressFormat)