Android调用手机拍照以及从相册选择照片

冰川孤辰 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;   
    }

相关推荐