1. 程式人生 > >安卓相機呼叫遇到的問題

安卓相機呼叫遇到的問題

Android_照相機Camera_呼叫系統照相機返回data為空
1.呼叫系統照相機
1 //例項化一個intent,並指定action
2 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
3 //指定一個圖片路徑對應的file物件
4 uri = Uri.fromFile(ImageUtil.getImageFile());
5 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
6 //啟動activity
7 startActivityForResult(intent, REQUEST_CODE_CAMERA);
但是在onActivityResult(int requestCode, int resultCode, Intent data)程式碼中得到的data總為null?
2.原因分析
於是我查看了Android系統框架Camera應用程式,找到了關於系統照相機如何處理返回值data問題!
預設情況下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相機有自己預設的儲存路徑,拍攝的照片將返回一個縮圖。如果想訪問原始圖片,可以通過dat extra能夠得到原始圖片位置。即,如果指定了目標uri,data就沒有資料,如果沒有指定uri,則data就返回有資料!現在想想,這種設計還是很合理的!
8 @Override
9 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
10 switch (requestCode) {
11 case REQUEST_CODE_CAMERA:
12 if (resultCode == RESULT_OK) {
13 if(data !=null){

//可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
14 //返回有縮圖
15 if(data.hasExtra(“data”)){
16 Bitmap thumbnail = data.getParcelableExtra(“data”);
17 //得到bitmap後的操作
18 }
19 }else{
20 //由於指定了目標uri,儲存在目標uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
21 // 通過目標uri,找到圖片
22 // 對圖片的縮放處理
23 // 操作
24 }
25 }
26 }
27 }
3.Android系統照相機部分關鍵原始碼

28 // First handle the no crop case – just return the value. If the
29 // caller specifies a “save uri” then write the data to it’s
30 // stream. Otherwise, pass back a scaled down version of the bitmap
31 // directly in the extras.
32 if (mSaveUri != null) { //存在mSaveUri,即指定了目標uri
33 OutputStream outputStream = null;
34 try {
35 outputStream = mContentResolver.openOutputStream(mSaveUri);
36 outputStream.write(data);
37 outputStream.close();
38
39 setResult(RESULT_OK); //直接返回RESULT_OK,並沒有指定intent
40 finish();
41 } catch (IOException ex) {
42 // ignore exception
43 } finally {
44 Util.closeSilently(outputStream);
45 }
46 } else {
47 Bitmap bitmap = createCaptureBitmap(data);
48 // 返回RESULT_OK,幷包含一個Intent物件,其中Extra中科key為data,value為一個bitmap
49 setResult(RESULT_OK, new Intent(“inline-data”).putExtra(“data”, bitmap));
50 finish();
51 }