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


1.調用系統照相機

 

//實例化一個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);
但是在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就返回有數據!現在想想,這種設計還是很合理的!

 

@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();
}


免責聲明!

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



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