android - studio - La cámara incorporada, que utiliza el MediaStore.EXTRA_OUTPUT adicional, almacena las imágenes dos veces(en mi carpeta y en la predeterminada)
take photo android (3)
Actualmente estoy desarrollando una aplicación que utiliza la cámara incorporada. Llamo a este fragmento haciendo clic en un botón:
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
path += "/myFolder/myPicture.jpg";
File file = new File( path );
//file.mkdirs();
Uri outputFileUri = Uri.fromFile( file );
//String absoluteOutputFileUri = file.getAbsolutePath();
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, 0);
Después de tomar la foto con la cámara, el jpg está bien almacenado en sdcard / myFolder / myPicture.jpg, pero también se almacena en / sdcard / DCIM / Camera / 2011-06-14 10.36.10.jpg, que es el valor predeterminado camino.
¿Hay alguna forma de evitar que la cámara incorporada almacene la imagen en la carpeta predeterminada?
Edit: creo que voy a usar la clase de cámara directamente
Mientras que la respuesta de "Ilango J" proporciona la idea básica ... pensé que realmente escribiría cómo lo hice. La ruta de archivo temporal que estábamos configurando en intent.putExtra () debe evitarse ya que no es una forma estándar en diferentes hardware. En HTC Desire (Android 2.2) no funcionó, y he oído que funciona en otros teléfonos. Es mejor tener un enfoque neutral que funcione en todas partes.
Tenga en cuenta que esta solución (con la intención) requiere que la tarjeta SD del teléfono esté disponible y no esté montada en la PC. Incluso la aplicación normal de la cámara no funcionaría cuando la tarjeta SD esté conectada a la PC.
1) Iniciar el intento de captura de cámara. Tenga en cuenta que deshabilité las escrituras de archivos temporales (no estándar en hardware diferente)
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(camera , 0);
2) Manejar la devolución de llamada y recuperar la ruta de la imagen capturada desde el objeto Uri y pasarla al paso # 3
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CAPTURE_PIC: {
if (resultCode == RESULT_OK && data != null) {
Uri capturedImageUri = data.getData();
String capturedPicFilePath = getRealPathFromURI(capturedImageUri);
writeImageData(capturedImageUri, capturedPicFilePath);
break;
}
}
}
}
public String getRealPathFromURI(Uri contentUri) {
String[] projx = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, projx, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
3) Clona y borra el archivo. Ver que utilicé el InputStream de Uri para leer el contenido. Lo mismo se puede leer desde el archivo de laPicFilePath capturedPicFilePath
.
public void writeImageData(Uri capturedPictureUri, String capturedPicFilePath) {
// Here''s where the new file will be written
String newCapturedFileAbsolutePath = "something" + JPG;
// Here''s how to get FileInputStream Directly.
try {
InputStream fileInputStream = getContentResolver().openInputStream(capturedPictureUri);
cloneFile(fileInputStream, newCapturedFileAbsolutePath);
} catch (FileNotFoundException e) {
// suppress and log that the image write has failed.
}
// Delete original file from Android''s Gallery
File capturedFile = new File(capturedPicFilePath);
boolean isCapturedCameraGalleryFileDeleted = capturedFile.delete();
}
public static void cloneFile(InputStream currentFileInputStream, String newPath) {
FileOutputStream newFileStream = null;
try {
newFileStream = new FileOutputStream(newPath);
byte[] bytesArray = new byte[1024];
int length;
while ((length = currentFileInputStream.read(bytesArray)) > 0) {
newFileStream.write(bytesArray, 0, length);
}
newFileStream.flush();
} catch (Exception e) {
Log.e("Prog", "Exception while copying file " + currentFileInputStream + " to "
+ newPath, e);
} finally {
try {
if (currentFileInputStream != null) {
currentFileInputStream.close();
}
if (newFileStream != null) {
newFileStream.close();
}
} catch (IOException e) {
// Suppress file stream close
Log.e("Prog", "Exception occured while closing filestream ", e);
}
}
}
Otra forma, probada en Android 2.1, es tomar la ID o la ruta Absoluta de la última imagen de la galería, luego puede eliminar la imagen duplicada.
Se puede hacer así:
/**
* Gets the last image id from the media store
* @return
*/
private int getLastImageId(){
final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
final String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
if(imageCursor.moveToFirst()){
int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
Log.d(TAG, "getLastImageId::id " + id);
Log.d(TAG, "getLastImageId::path " + fullPath);
imageCursor.close();
return id;
}else{
return 0;
}
}
Y para eliminar el archivo:
private void removeImage(int id) {
ContentResolver cr = getContentResolver();
cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) } );
}
Este código se basó en la publicación: Eliminación de una imagen de la galería después de haber tomado la fotografía de la intención
prueba este código:
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
path += "/myFolder/myPicture.jpg";
File file = new File( path );
//file.mkdirs();
Uri outputFileUri = Uri.fromFile( file );
//String absoluteOutputFileUri = file.getAbsolutePath();
intent.putExtra("output", outputFileUri);
startActivityForResult(intent, 0);