Photos taken by the ACTION_IMAGE_CAPTURE are not registered in the MediaStore automatically on all devices.
The official Android guide gives that example:
http://developer.android.com/guide/topics/media/camera.html#intent-receive
But that does not work either on all devices.
The only reliable method I am aware of consists in saving the path to the picture in a local variable. Beware that your app may get killed while in background (while the camera app is running), so you must save the path during onSaveInstanceState.
Edit after comment:
Create a temporary file name where the photo will be stored when starting the intent.
File tempFile = File.createTempFile("my_app", ".jpg");
fileName = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PICTURE_REQUEST_CODE);
fileName
is a String, a field of your activity. You must save it that way:
@Override
public void onSaveInstanceState(Bundle bundle)
{
super.onSaveInstanceState(bundle);
bundle.putString("fileName", fileName);
}
and recover it in onCreate():
public void onCreate(Bundle savedInstanceState)
{
if (savedInstanceState != null)
fileName = savedInstanceState.getString("fileName");
// ...
}
Now, at the time of onActivityResult, you know the name of the file where the photo was stored (fileName
). You can do anything you wish with it, and then delete it.
2013-09-19 edit: It seems that some camera apps ignore the putExtra uri, and store the pic in a different place. So, before using the value of fileName
you should check whether the intent is null or not. If you get a non-null intent, then you should prefer intent.getData()
over fileName
. Use fileName
as a backup solution only when it is needed.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…