1. 程式人生 > >android 呼叫系統相機拍照的各種異常處理

android 呼叫系統相機拍照的各種異常處理

1 本文只討論呼叫系統相機出現的異常解決辦法下面是呼叫系統相機的程式碼

先看一下最簡單的寫法

		Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
		startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);

 android.provider.MediaStore.ACTION_IMAGE_CAPTURE這個是呼叫系統相機的action

 SELECT_PIC_BY_TACK_PHOTO 這個用於在onActivityResult方法裡面(和requestCode對應)回撥判斷

在onActivityResult 這個方法裡面一般我們需要從回撥的Intent裡面取到我們需要的圖片

獲取圖片的方法 Bitmap photo = data.getParcelableExtra("data"); 

這裡面得到的是圖片的縮圖,但是有些手機這個取到的是是null,所以我們需要另外一種方式

2  指定圖片的拍攝路徑:

		Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
		Uri outputFileUri = Uri.fromFile(cameraTempFile);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
		startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);
這個時候onActivityResult回撥以後我們不在用 data.getParcelableExtra("data"); 而是用我們自己定義的cameraTempFile獲取拍照後儲存的圖片

注意:需要縮圖的自己用原圖生成即可,不要直接用否則可能會出現記憶體不足情況

3 用上面的方法依然會有一個問題,有些機型(主要是山寨機)你指定的這個檔案,拍照的時候直接奔潰

這個是否我們需要先建立這個檔案才可以

	cameraTempFile = new File(cameraTempPathDir + timeStamp + ".jpg");
		if (!cameraTempFile.exists()) {
			try {
				cameraTempFile.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
4 經過以上處理我們可以完美拍照了,什麼還有問題onActivityResult沒被呼叫

這個原因主要是你拍照的Activity被系統關閉了,這種情況下cameraTempFile如果不做處理也會為空,下面先說先原因

關閉原因 A 三星的camera強制切換到橫屏  導致Activity重啟生命週期 (但是部分機型  配置  android:configChanges  也不能阻止橫豎屏切換); 

              B 系統記憶體不足造成activity被關閉,這個時候會呼叫

public void onTrimMemory(int level) {
		super.onTrimMemory(level);
		switch (level) {
		case TRIM_MEMORY_UI_HIDDEN:// 記憶體不足,並且該程序的UI已經不可見了。
	}
	}

下面說下處理方案,也非常的簡單

如果 系統銷燬activity,   會在銷燬之前呼叫 onSaveInstanceState,我們在這個方法內 儲存圖片的路徑   

當activity重新建立的時候 會將 onSaveInstanceState  儲存的檔案傳遞給onCreate()當中

在onCreate當中  檢查照片的地址是否存在檔案  以此來判定拍照是否成功

然後拿到圖片在做後續處理即可

這個地址有一個完整的例子

http://blog.csdn.net/aaawqqq/article/details/37034243