There is a lot of information here about how to create a file on external storage in android, pass the uri to ACTION_IMAGE_CAPTURE and then save the image there.
However, I want to create a file in Application's private storage (sometimes referred to as internal storage) and pass that file uri to ACTION_IMAGE_CAPTURE but Camera intent returns RESULT_CANCELED in onActivityResult.
What do I do?
private void checkWhetherCameraIsAvailableAndTakeAPicture() {
// Check wether this device is able to take pictures
if (PhotoHandler.isIntentAvailable(a, MediaStore.ACTION_IMAGE_CAPTURE)) {
System.gc();
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File imageFile = null;
try {
if(a.application.user.isPublishImagesToGallery()){
imageFile = a.application.photoHandler.createImageFileOnExternalStorage();
} else {
imageFile = a.application.photoHandler.createImageFileOnInternalStorage();
}
imagePath = imageFile.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
} catch (IOException e) {
e.printStackTrace();
imageFile = null;
imagePath = null;
}
startActivityForResult(takePictureIntent, Preferences.REQUEST_CODE_TAKE_IMAGE_WITH_CAMERA);
} else { // Notify the user that their device is unable to take photos
a.application.toastMaker.toastLong(ErrorMessages.DEVICE_UNABLE_TO_TAKE_PHOTOS);
}
} // End of checkWhetherCameraIsAvailableAndTakeAPicture
public File createImageFileOnInternalStorage() throws IOException {
return createTempFileOnGivenLocation();
}
private String imageFilename() {
return filenamePrefix + Calendar.getInstance().getTimeInMillis();
}
private File createTempFileOnGivenLocation() throws IOException {
File imageFile = File.createTempFile(imageFilename(), filenameSuffix, context.getFilesDir());
setImagePathTemporary(imageFile.toString());
return imageFile;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Preferences.REQUEST_CODE_TAKE_IMAGE_WITH_CAMERA) {
if (resultCode != Activity.RESULT_CANCELED) {
handlePhotoTakenWithCamera();
} else {
// ONACTIVITYRESULT Returns Here!
new File(imagePath).delete())
}
} else if (requestCode == Preferences.REQUEST_CODE_PICK_IMAGES_FROM_GALLERY) {
if (resultCode != Activity.RESULT_CANCELED) {
handlePhotosPickedFromGallery(data);
}
}
} // End of onActivityResult