1.調用系統照相機
[java] view plaincopy
但是在onActivityResult(int requestCode, int resultCode, Intent data)代碼中得到的data總為null?
- //實例化一個intent,並指定action
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- //指定一個圖片路徑對應的file對象
- uri = Uri.fromFile(ImageUtil.getImageFile());
- intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
- //啟動activity
- startActivityForResult(intent, REQUEST_CODE_CAMERA);
2.原因分析
於是我查看了Android系統框架Camera應用程序,找到了關於系統照相機如何處理返回值data問題!
默認情況下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相機有自己默認的存儲路徑,拍攝的照片將返回一個縮略圖。如果想訪問原始圖片,可以通過dat extra能夠得到原始圖片位置。即,如果指定了目標uri,data就沒有數據,如果沒有指定uri,則data就返回有數據!現在想想,這種設計還是很合理的!
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_CODE_CAMERA:
- if (resultCode == RESULT_OK) {
- if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
- //返回有縮略圖
- if(data.hasExtra("data")){
- Bitmap thumbnail = data.getParcelableExtra("data");
- //得到bitmap后的操作
- }
- }else{
- //由於指定了目標uri,存儲在目標uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
- // 通過目標uri,找到圖片
- // 對圖片的縮放處理
- // 操作
- }
- }
- }
- }
3.Android系統照相機部分關鍵源碼
- // First handle the no crop case -- just return the value. If the
- // caller specifies a "save uri" then write the data to it's
- // stream. Otherwise, pass back a scaled down version of the bitmap
- // directly in the extras.
- if (mSaveUri != null) { //存在mSaveUri,即指定了目標uri
- OutputStream outputStream = null;
- try {
- outputStream = mContentResolver.openOutputStream(mSaveUri);
- outputStream.write(data);
- outputStream.close();
- setResult(RESULT_OK); //直接返回RESULT_OK,並沒有指定intent
- finish();
- } catch (IOException ex) {
- // ignore exception
- } finally {
- Util.closeSilently(outputStream);
- }
- } else {
- Bitmap bitmap = createCaptureBitmap(data);
- // 返回RESULT_OK,並包含一個Intent對象,其中Extra中科key為data,value為一個bitmap
- setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));
- finish();
- }