Я использую ACTION_IMAGE_CAPTURE
с предопределенной целью Uri в значительной степени, как указано в документации. Однако, когда я пытаюсь декодировать изображение сразу после получения моей активности, decodeStream()
терпит неудачу. Если я попробую еще раз через несколько секунд, все будет хорошо. Я предполагаю, что файл записывается асинхронно в фоновом режиме. Как я могу узнать, когда он доступен для использования?Изображение, снятое с ACTION_IMAGE_CAPTURE - первый вызов decodeStream не работает, другие OK
Вот основные части моего кода:
Определение имя целевого файла:
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