次の方法で MediaStore.ACTION_IMAGE_CAPTURE インテントで写真を撮ろうとしています:
String fileName = "testphoto.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION,
"Image capture by camera");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
imageUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE)
.putExtra(MediaStore.EXTRA_OUTPUT,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI),
R.id.capture_image_request);
取り扱い実績:
try {
uploadedPicture = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageUri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
その後、撮影したばかりの画像を表示しようとしています:
((ImageView) findViewById(R.id.profile_picture_thumbnail)).setImageBitmap(uploadedPicture);
そして、それはうまくいきません。その後、その Uri から入力ストリームを開こうとしました。
final InputStream is = getContentResolver().openInputStream(uri);
Log.("mydebug tag", is.available());
is.available() は 0 を返します。なぜそのファイルは空なのですか???
デバッグしてみると「content://media/external/images/media/68」のようなUriが返ってきました。その後、私はハードコーディングしました:
Uri uri = Uri.parse("content://media/external/images/media/68");
Bitmap pic;
try {
pic = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
((ImageView) findViewById(R.id.profile_picture_thumbnail)).setImageBitmap(pic);
} catch (FileNotFoundException e) {
Log.e(TAG, e.getMessage());
}
そして、それはうまくいきました。
では、手動で Uri を作成すると動作するのに、撮影したばかりの写真の Uri を受信すると動作しないのはなぜでしょうか? 撮影したばかりの写真の Uri にアクセスすると、まだファイル システムに保存されていないような気がします。そのため、サイズは 0 で、ImageView に読み込むことができません。しかし、しばらくすると (ハードコードされた Uri を使用してアプリケーションを再度実行すると)、ファイルが保存され、正常に動作します。そのファイルを強制的にディスクにフラッシュする方法はありますか?