冰川孤辰 2011-10-09
/*用来标识请求照相功能的activity*/ private static final int CAMERA_WITH_DATA = 3023; /*用来标识请求gallery的activity*/ private static final int PHOTO_PICKED_WITH_DATA = 3021; /*拍照的照片存储位置*/ private static final File PHOTO_DIR = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera"); private File mCurrentPhotoFile;//照相机拍照得到的图片
private void doPickPhotoAction() { Context context = EditContact.this; // Wrap our context to inflate list items using correct theme final Context dialogContext = new ContextThemeWrapper(context, android.R.style.Theme_Light); String cancel="返回"; String[] choices; choices = new String[2]; choices[0] = getString(R.string.take_photo); //拍照 choices[1] = getString(R.string.pick_photo); //从相册中选择 final ListAdapter adapter = new ArrayAdapter<String>(dialogContext, android.R.layout.simple_list_item_1, choices); final AlertDialog.Builder builder = new AlertDialog.Builder( dialogContext); builder.setTitle(R.string.attachToContact); builder.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); switch (which) { case 0:{ String status=Environment.getExternalStorageState(); if(status.equals(Environment.MEDIA_MOUNTED)){//判断是否有SD卡 doTakePhoto();// 用户点击了从照相机获取 } else{ showToast("没有SD卡"); } break; } case 1: doPickPhotoFromGallery();// 从相册中去获取 break; } } }); builder.setNegativeButton(cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } } /** * 拍照获取图片 * */ protected void doTakePhoto() { try { // Launch camera to take photo for selected contact PHOTO_DIR.mkdirs();// 创建照片的存储目录 mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());// 给新照的照片文件命名 final Intent intent = getTakePickIntent(mCurrentPhotoFile); startActivityForResult(intent, CAMERA_WITH_DATA); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } public static Intent getTakePickIntent(File f) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); return intent; } /** * 用当前时间给取得的图片命名 * */ private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat( "'IMG'_yyyy-MM-dd HH:mm:ss"); return dateFormat.format(date) + ".jpg"; } // 请求Gallery程序 protected void doPickPhotoFromGallery() { try { // Launch picker to choose photo for selected contact final Intent intent = getPhotoPickIntent(); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.photoPickerNotFoundText1, Toast.LENGTH_LONG).show(); } } // 封装请求Gallery的intent public static Intent getPhotoPickIntent() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); intent.setType("image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 80); intent.putExtra("outputY", 80); intent.putExtra("return-data", true); return intent; } // 因为调用了Camera和Gally所以要判断他们各自的返回情况,他们启动时是这样的startActivityForResult protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case PHOTO_PICKED_WITH_DATA: {// 调用Gallery返回的 final Bitmap photo = data.getParcelableExtra("data"); // 下面就是显示照片了 System.out.println(photo); //缓存用户选择的图片 img = getBitmapByte(photo); mEditor.setPhotoBitmap(photo); System.out.println("set new photo"); break; } case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片 doCropPhoto(mCurrentPhotoFile); break; } } } protected void doCropPhoto(File f) { try { // 启动gallery去剪辑这个照片 final Intent intent = getCropImageIntent(Uri.fromFile(f)); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA); } catch (Exception e) { Toast.makeText(this, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } /** * Constructs an intent for image cropping. 调用图片剪辑程序 */ public static Intent getCropImageIntent(Uri photoUri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(photoUri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 80); intent.putExtra("outputY", 80); intent.putExtra("return-data", true); return intent; }
Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像。Problem: 拍好照片,点击裁剪,弹Toast“无法加载此图片”。Solution: 在裁剪的class里加两行代码