万幸的是CROP提供的选项中,还有一个,可以自定义裁切输出的图片存储位置。利用这一点,就可以规避Intent携带信息的不靠谱所造成的吃饭不香。
01    //发送请求
02    Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
03    intent.setType("image/*");
04    intent.putExtra("crop", "true");
05    intent.putExtra("aspectX", 1);
06    intent.putExtra("aspectY", 1);
07    intent.putExtra("outputX", 1000);
08    intent.putExtra("outputY", 1000);
09    intent.putExtra("scale", true);
10    intent.putExtra("return-data", false);
11    intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
12    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
13    intent.putExtra("noFaceDetection", true);
14    startActivityForResult(intent, PHOTORESOULT);
15    
16    //选择存储位置
17    Uri tempPhotoUri;
18    
19    private Uri getTempUri() {
20        Uri tempPhotoUri = Uri.fromFile(getTempFile());
21        return tempPhotoUri;
22    }
23    
24    private File getTempFile() {
25        if (isSDCARDMounted()) {
26    
27        File f = new File(Environment.getExternalStorageDirectory(),"temp.jpg");
28        try {
29            f.createNewFile();
30        } catch (IOException e) {
31                ...
32            }
33        return f;
34        }
35        return null;
36    }
37    
38    // 注意,在我做的测试中,使用内部缓存是无法正确写入裁切后的图片的。请大家有兴趣的测试一番,看是否有意外。
39    // 系统是用全局的ContentResolver来做这个过程的文件io操作,app内部的存储被忽略。(猜测)
40    /*
41        File f = new File(getCacheDir(), "temp.jpg");
42        try {
43            f.createNewFile();
44        } catch (IOException e) {
45           ...
46        }
47        return f;
48        }
49    */
50    
51    private boolean isSDCARDMounted(){
52        String status = Environment.getExternalStorageState();
53    
54        if (status.equals(Environment.MEDIA_MOUNTED)){
55            return true;
56        }
57        return false;
58    }
59    
60    // 处理结果
61    //
62    Bitmap bitmap = null;
63    try {              
64        bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempPhotoUri));
65    } catch (FileNotFoundException e) {
66        e.printStackTrace();
67    }
Android相关内容: