我正在使用ACTION_IMAGE_CAPTURE
與預定目標Uri非常符合文檔中的建議。但是,當我的活動獲取後立即嘗試解碼圖像時,decodeStream()
失敗。如果幾秒鐘後再次嘗試,它可以正常工作。我想這個文件是在後臺異步寫入的。我如何知道它何時可以使用?使用ACTION_IMAGE_CAPTURE拍攝的圖片 - 第一個decodeStream調用失敗,其他確定
這裏是我的代碼的關鍵部分:拍照
String filename = String.format("pic%d.jpg", new Date().getTime());
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), filename);
try {
file.createNewFile();
} catch (IOException e) {
file = new File(context.getFilesDir(), filename);
}
targetUri = Uri.fromFile(photoFile);
:
確定目標文件名
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, targetUri);
fragment.startActivityForResult(takePictureIntent, RESULT_TAKE_PICTURE);
在onActivityResult()
:
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
// Note that data.getData() is null here.
InputStream is = getContentResolver().openInputStream(targetUri);
if (is != null) {
Bitmap bm = BitmapFactory.decodeStream(is);
decodeStream
返回null。如果幾秒鐘後再次進行相同的呼叫,則會成功。有什麼文件可用時告訴我什麼?
UPDATE:繼greenapps'的建議,我在做decodeStream
電話與inJustDecodeBounds
率先拿到尺寸,看它是否是一個記憶的問題。發現這個第一個僅限界限的解碼傳遞失敗,但是現在實際的decodeStream調用立即成功!如果我再做兩次,他們都成功了!
因此,看起來第一個撥打decodeStream
的電話總是失敗,其他所有電話都很好,即使它們之後立即發生(=在同一方法中)。所以這可能不是一個異步寫入的問題。但別的東西。但是什麼?
targetURI中和URI? – greenapps
你是如何設定targetUri的?從文件系統路徑?然後在原始路徑上使用decodeFile。 – greenapps
'我想這個文件是在後臺異步寫入的。我認爲decodeStream由於內存不足而返回null。一段時間後,gc已經恢復得足夠了。嘗試只解碼邊界。 – greenapps