感谢一下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">
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(); } }