拍照,裁剪照片

来源:互联网 发布:手机制作效果图软件 编辑:程序博客网 时间:2024/05/01 12:00

程序中的主要代码

package com.example.photo;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {private final static String FILE_SAVEPATH = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/Laiguo/Portrait/";private Button btn_take;private Button btn_pick;private Uri origUri;private Uri cropUri;private File protraitFile;private Bitmap protraitBitmap;private String protraitPath;private final static int CROP = 200;public final static String SDCARD_MNT = "/mnt/sdcard";public final static String SDCARD = "/sdcard";/** 请求相册 */public static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0;/** 请求相机 */public static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1;/** 请求裁剪 */public static final int REQUEST_CODE_GETIMAGE_BYCROP = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_take = (Button) findViewById(R.id.button1);btn_pick = (Button) findViewById(R.id.button2);btn_take.setOnClickListener(this);btn_pick.setOnClickListener(this);}@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.button1:startActionCamera();break;case R.id.button2:startImagePick();break;}}// 拍照private void startActionCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, this.getCameraTempFile());startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCAMERA);}@Overrideprotected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {if (resultCode != RESULT_OK)return;switch (requestCode) {case REQUEST_CODE_GETIMAGE_BYCAMERA:startActionCrop(origUri);// 拍照后裁剪break;case REQUEST_CODE_GETIMAGE_BYCROP:startActionCrop(data.getData());// 选图后裁剪break;case REQUEST_CODE_GETIMAGE_BYSDCARD:// uploadNewPhoto();// 上传新照片// protraitPath 最后的图片路径break;}}/** * 选择图片裁剪 *  * @param output */private void startImagePick() {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_CODE_GETIMAGE_BYCROP);}// 拍照保存的绝对路径private Uri getCameraTempFile() {String storageState = Environment.getExternalStorageState();if (storageState.equals(Environment.MEDIA_MOUNTED)) {File savedir = new File(FILE_SAVEPATH);if (!savedir.exists()) {savedir.mkdirs();}} else {System.out.println("无法保存上传的头像,请检查SD卡是否挂载");return null;}String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());// 照片命名String cropFileName = "osc_camera_" + timeStamp + ".jpg";// 裁剪头像的绝对路径protraitPath = FILE_SAVEPATH + cropFileName;protraitFile = new File(protraitPath);cropUri = Uri.fromFile(protraitFile);this.origUri = this.cropUri;return this.cropUri;}// 裁剪头像的绝对路径private Uri getUploadTempFile(Uri uri) {String storageState = Environment.getExternalStorageState();if (storageState.equals(Environment.MEDIA_MOUNTED)) {File savedir = new File(FILE_SAVEPATH);if (!savedir.exists()) {savedir.mkdirs();}} else {System.out.println("无法保存上传的头像,请检查SD卡是否挂载");return null;}String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());String thePath = getAbsolutePathFromNoStandardUri(uri);// 如果是标准Uriif (isEmpty(thePath)) {thePath = getAbsoluteImagePath(this, uri);}String ext = getFileFormat(thePath);ext = isEmpty(ext) ? "jpg" : ext;// 照片命名String cropFileName = "osc_crop_" + timeStamp + "." + ext;// 裁剪头像的绝对路径protraitPath = FILE_SAVEPATH + cropFileName;protraitFile = new File(protraitPath);cropUri = Uri.fromFile(protraitFile);return this.cropUri;}private void startActionCrop(Uri data) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(data, "image/*");intent.putExtra("output", getUploadTempFile(data));intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);// 裁剪框比例intent.putExtra("aspectY", 1);intent.putExtra("outputX", CROP);// 输出图片大小intent.putExtra("outputY", CROP);intent.putExtra("scale", true);// 去黑边intent.putExtra("scaleUpIfNeeded", true);// 去黑边startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYSDCARD);}/** * 判断当前Url是否标准的content://样式,如果不是,则返回绝对路径 *  * @param uri * @return */public static String getAbsolutePathFromNoStandardUri(Uri mUri) {String filePath = null;String mUriString = mUri.toString();mUriString = Uri.decode(mUriString);String pre1 = "file://" + SDCARD + File.separator;String pre2 = "file://" + SDCARD_MNT + File.separator;if (mUriString.startsWith(pre1)) {filePath = Environment.getExternalStorageDirectory().getPath() + File.separator+ mUriString.substring(pre1.length());} else if (mUriString.startsWith(pre2)) {filePath = Environment.getExternalStorageDirectory().getPath() + File.separator+ mUriString.substring(pre2.length());}return filePath;}/** * 判断给定字符串是否空白串。 空白串是指由空格、制表符、回车符、换行符组成的字符串 若输入字符串为null或空字符串,返回true *  * @param input * @return boolean */public static boolean isEmpty(String input) {if (input == null || "".equals(input))return true;for (int i = 0; i < input.length(); i++) {char c = input.charAt(i);if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {return false;}}return true;}/** * 通过uri获取文件的绝对路径 *  * @param uri * @return */@SuppressWarnings("deprecation")public static String getAbsoluteImagePath(Activity context, Uri uri) {String imagePath = "";String[] proj = { MediaStore.Images.Media.DATA };Cursor cursor = context.managedQuery(uri, proj, // Which columns to// returnnull, // WHERE clause; which rows to return (all rows)null, // WHERE clause selection arguments (none)null); // Order-by clause (ascending by name)if (cursor != null) {int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);if (cursor.getCount() > 0 && cursor.moveToFirst()) {imagePath = cursor.getString(column_index);}}return imagePath;}/** * 获取文件扩展名 *  * @param fileName * @return */public static String getFileFormat(String fileName) {if (isEmpty(fileName))return "";int point = fileName.lastIndexOf('.');return fileName.substring(point + 1);}}


需要的权限

<uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />    <uses-permission android:name="android.permission.RESTART_PACKAGES" />    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.VIBRATE" />    <uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.FLASHLIGHT" />

代码下载地址:

http://download.csdn.net/detail/hkg1pek/8111425



0 0