Android_照相機Camera_調用系統照相機返回data為空


1.調用系統照相機

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

 
  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就返回有數據!現在想想,這種設計還是很合理的!

 

[java]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     switch (requestCode) {  
  4.     case REQUEST_CODE_CAMERA:  
  5.         if (resultCode == RESULT_OK) {  
  6.             if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  7.                 //返回有縮略圖  
  8.                 if(data.hasExtra("data")){  
  9.                     Bitmap thumbnail = data.getParcelableExtra("data");  
  10.                     //得到bitmap后的操作  
  11.                 }  
  12.             }else{  
  13.                 //由於指定了目標uri,存儲在目標uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  14.                 // 通過目標uri,找到圖片  
  15.                 // 對圖片的縮放處理  
  16.                 // 操作  
  17.             }  
  18.         }  
  19.     }  
  20. }  

 

3.Android系統照相機部分關鍵源碼

 

[java]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. // First handle the no crop case -- just return the value.  If the  
  2. // caller specifies a "save uri" then write the data to it's  
  3. // stream. Otherwise, pass back a scaled down version of the bitmap  
  4. // directly in the extras.  
  5. if (mSaveUri != null) { //存在mSaveUri,即指定了目標uri  
  6.     OutputStream outputStream = null;  
  7.     try {  
  8.         outputStream = mContentResolver.openOutputStream(mSaveUri);  
  9.         outputStream.write(data);  
  10.         outputStream.close();  
  11.   
  12.         setResult(RESULT_OK);   //直接返回RESULT_OK,並沒有指定intent  
  13.         finish();  
  14.     } catch (IOException ex) {  
  15.         // ignore exception  
  16.     } finally {  
  17.         Util.closeSilently(outputStream);  
  18.     }  
  19. else {  
  20.     Bitmap bitmap = createCaptureBitmap(data);  
  21.     // 返回RESULT_OK,並包含一個Intent對象,其中Extra中科key為data,value為一個bitmap  
  22.     setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));  
  23.     finish();  
  24. }  

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM