万幸的是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相关内容: