首先展示 相机的:

    打开相机:打开相机之前要在intent中  定义字段 MedisStore.EXTRA_OUTPUT ,值为拍照后存照片的路径。  首先定义存相机拍照的照片的路径 ,这个路径你可以存在你想存的地方, 接下来是定义照片的名字 ,这里取 当前系统时间+.jpg 作为照片名称 

      照片的路径=  文件夹路径+ 文件名+ .jpg ;

public void openCamare() {
    String state = Environment.getExternalStorageState();
    if (state.equals(Environment.MEDIA_MOUNTED)) {
        String aa = path + "mass/";
        File file = new File(aa);
        if (!file.exists()) {
            file.mkdir();
        }
        String fileName = getPhoneFileName() + ".jpg";
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        phoneUri = Uri.fromFile(new File(aa + fileName));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, phoneUri);
        startActivityForResult(intent, REQUEST_CAMERA);
    }
}

相机 中的 图片 返回 onActivityResult 中:

case REQUEST_CAMERA://相机返回的图片

  Uri uri = null;

if (data != null && data.getData() != null) {
        uri = data.getData();}
    if (uri == null) {
        if (phoneUri != null) {
            uri = phoneUri;}}
    //imgPhone.setImageURI(uri);
    camCropUri = uri;
    cropImageUri(uri, 400, 400, REQUEST_XIANGJI);

  注意 ,这里返回的 data.getData( )可能是 空的,如果是空的,可以取上面 存储的phoneUri ,uri 类似 File 。可以通过uri找到 图片。 

相机对应的 裁剪方法:

void cropImageUri(Uri uri, int outputX, int outputY, int requestCode) {
    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", outputX);
    intent.putExtra("outputY", outputY);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    intent.putExtra("return-data", false);//这里是 false的 话 ,返回 Uri ,若为true的则返回小的 bitmap
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", true); // no face detection
    startActivityForResult(intent, requestCode);
}

对应的 onActivityResult 中 裁剪之后的图片的返回  

case REQUEST_XIANGJI://相机图片 的 裁剪
    Toast.makeText(this, "返回相机裁剪的图片", Toast.LENGTH_SHORT).show();
    imgPhone.setImageURI(camCropUri);
    break;

其中 打开裁剪的 intent中 ,一个参数 return-data,值为 true ,则返回 小图bitmap; 值为false 则返回 uri ,uri可以记录操作,还要注意一下 字段   outputFormat

如果对 URI 足够了解的话,应该知道 URI与File 相似,你所有的操作如裁剪将数据都保存在 URI中,你已经持有了相应的URI,也就无需多此一举,在返回bitmap了

相册 返回裁剪的图片也是这样 。 Android 4.4 之后,相册返回的Uri 是经过封装的,这个Uri 应该经过处理一下, 

代码如下:

/**
 * android 4.4以上的Uri 返回形式如下:
 * content://com.android.providers.media.documents/document/image%3A8302
 * content://com.android.providers.downloads.documents/document/5
 * content://media/external/images/media/8302
 * 我们不能直接通过前两种Uri直接获取到对应的表,所以需要“翻译一下”
 * 这个方法是 给 相册返回的 uri 使用的
 */
private String handleImageOnKitKat(Uri uri) {
    String imagePath = null;
    if (DocumentsContract.isDocumentUri(this, uri)) {//第一种处理
        String docId = DocumentsContract.getDocumentId(uri);
        if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
            Log.i(">>>>>", uri.toString());
            String id = docId.split(":")[1];
            String selection = MediaStore.Images.Media._ID + "=" + id;
            imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {//第二种,处理
            Log.i(">>>>>", uri.toString());
            Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
            imagePath = getImagePath(contentUri);
        }
    } else if ("content".equalsIgnoreCase(uri.getScheme())) {
        Log.d(">>>>>", "content: " + uri.toString());
        imagePath = getImagePath(uri);
    }
    Log.i(">>>>>>", "imagePath" + imagePath);
    return imagePath;
}

打开相机或者相册 获取  对应返回图片的 Uri ,然后 把uri 传递到裁剪方法中 ,然后 打开裁剪框,裁剪之后  回调onActivityResult ,在 裁剪回调中获取 裁剪之后的图片 ,完成这一操作。

好了 ,打开相机和相册的裁剪说到这里