转载自:http://blog.csdn.net/harvic880925/article/details/43163175
拍照及裁剪终极方案
首先声明两个Uri,一个保存拍照的结果,一个保存裁剪的结果:
- 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;
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- String path = getSDCardPath();
- File file = new File(path + "/temp.jpg");
- imageUri = Uri.fromFile(file);
- File cropFile = new File(getSDCardPath() + "/temp_crop.jpg");
- 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);
- }
- 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: {
- cropImg(imageUri);
- }
- 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);
- }
然后接收返回的结果:
- 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: {
- 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 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");
- imageUri = Uri.fromFile(file);
- File cropFile = new File(getSDCardPath() + "/temp_crop.jpg");
- 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);
- }
- 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);
- }
- @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: {
- 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 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();
- }
- }
源码内容:
1、BlogCameraOnly:仅拍照功能
2、BlogCameraCropCrash:第三部分对应的源码,根本起不来裁剪Intent,造成Crash
3、BlogCameraCropFinally:拍照及裁剪的终极方案;
如果本文有帮到你,记得关注哦
源码下载地址:http://download.csdn.net/detail/harvic880925/8412983
请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/43163175 谢谢。