- /*用来标识请求照相功能的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;
- }