2015-10-17 100 views
1

我正在嘗試使用IMAGE_CAPTURE意圖拍照並立即在屏幕上顯示此照片。我做什麼:Android IMAGE_CAPTURE意圖在onActivityResult後保存照片

File photoFile = createImageFile(); 
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
startActivityForResult(intent, REQUEST_CAMERA); 

創建映像文件的方法:

private File createImageFile() { 
    File dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    File photoFile = null; 
    try { 
     photoFile = File.createTempFile("photo", ".jpg", dir); 
     mPhotoPath = photoFile.getAbsolutePath(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return photoFile; 
} 

onActivityResult叫我執行:

Bitmap photo = BitmapFactory.decodeFile(mPhotoPath); 
mPhoto.setImageBitmap(photo); 

這是一個問題。顯然IMAGE_CAPTURE活動將圖像保存到背景中的文件中,並且在圖像被保存之前,我的onActivityResult被執行。因爲這個我的photo == null。如果我在BitmapFactory.decodeFile呼叫之前放置斷點,它也可以工作。我用一個醜陋的黑客修復它:

while (photo == null) { 
    photo = BitmapFactory.decodeFile(mPhotoPath); 
} 

所以,我做錯了什麼?爲什麼它以這種方式工作?

我對棉花糖的Nexus測試5.

+0

使用'onSaveInstanceState()'和'onRestoreInstanceState'來保存文件路徑。請參閱此[SO答案](http://stackoverflow.com/a/32723550/3140227)。 –

回答

1

顯然IMAGE_CAPTURE活動圖像保存在後臺文件和圖像保存

我會認爲這是一個我onActivityResult被執行處理您的請求的特定相機應用程序中的錯誤。有數百個,如果不是數千個這樣的相機應用程序,並且這樣的錯誤有點常見。

我的醜陋的黑客

這樣的忙循環是不是一個好主意固定它。除此之外,如果在主應用程序線程中完成,它會凍結你的UI,並且即使在後臺線程完成,它也會嚴重咀嚼CPU。

我會嘗試a FileObserver來觀察文件何時關閉,以便進行更多的事件驅動。如果出於某種原因,你不能得到那個工作:

  • 確保你正在做你的手錶換了文件的邏輯在後臺線程
  • 加試之間合理SystemClock.sleep()週期(例如, ,50ms)