Guardar las imágenes pulsadas en la carpeta personalizada (Preferentemente interna a la aplicación) en lugar de la galería

Estoy intentando incorporar la funcionalidad de la cámara en la aplicación. Puedo guardar imágenes en la carpeta personalizada, pero el problema es que las imágenes se están guardando en la carpeta de la cámara (donde las fotos de la cámara se guardan) también. Así que hay imágenes duplicadas para cada imagen que tomo. No quiero eso. El siguiente es el código:

public class PhotoIntentActivity extends Activity { private static final int ACTION_TAKE_PHOTO_B = 1; private static final String BITMAP_STORAGE_KEY = "viewbitmap"; private static final String IMAGEVIEW_VISIBILITY_STORAGE_KEY = "imageviewvisibility"; private ImageView mImageView; private Bitmap mImageBitmap; private String mCurrentPhotoPath; private static final String JPEG_FILE_PREFIX = "IMG_"; private static final String JPEG_FILE_SUFFIX = ".jpg"; private AlbumStorageDirFactory mAlbumStorageDirFactory = null; /* Photo album for this application */ private String getAlbumName() { return getString(R.string.album_name); } private File getAlbumDir() { File storageDir = null; if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { storageDir = mAlbumStorageDirFactory .getAlbumStorageDir(getAlbumName(), getApplicationContext()); if (storageDir != null) { if (!storageDir.mkdirs()) { if (!storageDir.exists()) { Log.d("CameraSample", "failed to create directory"); return null; } } } } else { Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE."); } return storageDir; } private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; File albumF = getAlbumDir(); File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF); return imageF; } private File setUpPhotoFile() throws IOException { File f = createImageFile(); mCurrentPhotoPath = f.getAbsolutePath(); return f; } private void setPic() { /* There isn't enough memory to open up more than a couple camera photos */ /* So pre-scale the target bitmap into which the file is decoded */ /* Get the size of the ImageView */ int targetW = mImageView.getWidth(); int targetH = mImageView.getHeight(); /* Get the size of the image */ BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; /* Figure out which way needs to be reduced less */ int scaleFactor = 1; if ((targetW > 0) || (targetH > 0)) { scaleFactor = Math.min(photoW / targetW, photoH / targetH); } /* Set bitmap options to scale the image decode target */ bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; /* Decode the JPEG file into a Bitmap */ Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); /* Associate the Bitmap to the ImageView */ mImageView.setImageBitmap(bitmap); mImageView.setVisibility(View.VISIBLE); } private void galleryAddPic() { Intent mediaScanIntent = new Intent( "android.intent.action.MEDIA_SCANNER_SCAN_FILE"); File f = new File(mCurrentPhotoPath); System.out.println(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } private void dispatchTakePictureIntent(int actionCode) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); switch (actionCode) { case ACTION_TAKE_PHOTO_B: File f = null; try { f = setUpPhotoFile(); mCurrentPhotoPath = f.getAbsolutePath(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); } catch (IOException e) { e.printStackTrace(); f = null; mCurrentPhotoPath = null; } break; default: break; } // switch startActivityForResult(takePictureIntent, actionCode); } private void handleBigCameraPhoto() { if (mCurrentPhotoPath != null) { setPic(); galleryAddPic(); mCurrentPhotoPath = null; } } Button.OnClickListener mTakePicOnClickListener = new Button.OnClickListener() { @Override public void onClick(View v) { dispatchTakePictureIntent(ACTION_TAKE_PHOTO_B); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mImageView = (ImageView) findViewById(R.id.imageView1); mImageBitmap = null; Button picBtn = (Button) findViewById(R.id.btnIntend); setBtnListenerOrDisable(picBtn, mTakePicOnClickListener, MediaStore.ACTION_IMAGE_CAPTURE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { mAlbumStorageDirFactory = new FroyoAlbumDirFactory(); } else { mAlbumStorageDirFactory = new BaseAlbumDirFactory(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case ACTION_TAKE_PHOTO_B: { if (resultCode == RESULT_OK) { handleBigCameraPhoto(); } break; } } } // Some lifecycle callbacks so that the image can survive orientation change @Override protected void onSaveInstanceState(Bundle outState) { outState.putParcelable(BITMAP_STORAGE_KEY, mImageBitmap); outState.putBoolean(IMAGEVIEW_VISIBILITY_STORAGE_KEY, (mImageBitmap != null)); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mImageBitmap = savedInstanceState.getParcelable(BITMAP_STORAGE_KEY); mImageView.setImageBitmap(mImageBitmap); mImageView .setVisibility(savedInstanceState .getBoolean(IMAGEVIEW_VISIBILITY_STORAGE_KEY) ? ImageView.VISIBLE : ImageView.INVISIBLE); } /** * Indicates whether the specified action can be used as an intent. This * method queries the package manager for installed packages that can * respond to an intent with the specified action. If no suitable package is * found, this method returns false. * http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html * * @param context * The application's environment. * @param action * The Intent action to check for availability. * * @return True if an Intent with the specified action can be sent and * responded to, false otherwise. */ public static boolean isIntentAvailable(Context context, String action) { final PackageManager packageManager = context.getPackageManager(); final Intent intent = new Intent(action); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } private void setBtnListenerOrDisable(Button btn, Button.OnClickListener onClickListener, String intentName) { if (isIntentAvailable(this, intentName)) { btn.setOnClickListener(onClickListener); } else { btn.setText(getText(R.string.cannot).toString() + " " + btn.getText()); btn.setClickable(false); } } public final class FroyoAlbumDirFactory extends AlbumStorageDirFactory { @Override public File getAlbumStorageDir(String albumName, Context context) { // TODO Auto-generated method stub return new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),albumName); } } 

Gracias por adelantado.

Puede borrar el archivo una vez que se haya guardado en su archivo personalizado. Si no está seguro del nombre del archivo que tomó la cámara, puede ver la marca de tiempo o, si está dispuesto a volverse loco, puede usar FileObserver para esperar a que el archivo termine de escribir antes de borrarlo (Si la concurrencia es un problema y algo malo sucede.)

Después de hacer algunas investigaciones, encontré que esa respuesta se publica aquí: Doble guardar la imagen

La mejor solución se guarda en el directorio de la caché de la aplicación, que sólo es accesible desde usted. Contexto de la aplicación context.getCacheDir()

O utilice esta clase y llame a ExternalStorage.getSDCacheDir(context,"dirname");

 import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.Context; public class ExternalStorage { // Convention for external storage path used by Android 2.2. private static final String EXT_STORAGE_ROOT_PREFIX = "/Android/data/"; private static final String EXT_STORAGE_ROOT_SUFFIX = "/files/"; private static StringBuilder sStoragePath = new StringBuilder(); private static final String ALTERNATE_SDCARD_MOUNTS[] = { "/emmc", "/sdcard/ext_sd", // Newer (2011) HTC devices (Flyer, Rezound) "/sdcard-ext", // Some Motorola devices (RAZR) "/sdcard/sd", // Older Samsung Galaxy S (Captivate) "/sdcard/sdcard" // Archos tablets }; /** * Create given directory on sd card application cache Directory. * * @param context * @param dirName * @return created cache directory file, if not created return null. */ public static File getSDCacheDir(Context context, String dirName) { File cacheDir = null; // Check to see if SD Card is mounted and read/write accessible if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment .getExternalStorageState())) { // Get the directory on the SD card to store content // Attempt to use getExternalFilesDir() if we are on Android 2.2 or newer // Data stored in this location will auto-delete with app uninstall Method getExternalFilesDirMethod = null; try { getExternalFilesDirMethod = Context.class.getMethod( "getExternalFilesDir", String.class); cacheDir = (File) getExternalFilesDirMethod.invoke(context, dirName); } catch (NoSuchMethodException e) { // Android 2.1 and earlier - use old APIs cacheDir = buildCacheDirPath(context, android.os.Environment.getExternalStorageDirectory(), dirName); } catch (IllegalArgumentException e) { cacheDir = buildCacheDirPath(context, android.os.Environment.getExternalStorageDirectory(), dirName); } catch (IllegalAccessException e) { cacheDir = buildCacheDirPath(context, android.os.Environment.getExternalStorageDirectory(), dirName); } catch (InvocationTargetException e) { cacheDir = buildCacheDirPath(context, android.os.Environment.getExternalStorageDirectory(), dirName); } } if (cacheDir == null) { // Attempting to find the default external storage was a failure. // Look for another suitable external filesystem where we can store // our crap for (int i = 0; i < ALTERNATE_SDCARD_MOUNTS.length; i++) { File alternateDir = new File(ALTERNATE_SDCARD_MOUNTS[i]); if (alternateDir.exists() && alternateDir.isDirectory() && alternateDir.canRead() && alternateDir.canWrite()) { cacheDir = buildCacheDirPath(context, alternateDir, dirName); break; } } } // Attempt to create folder on external storage if it does not exist if (cacheDir != null && !cacheDir.exists()) { if (!cacheDir.mkdirs()) { cacheDir = null; // Failed to create folder } } // Fall back on internal cache as a last resort if (cacheDir == null) { cacheDir = new File(context.getCacheDir() + File.separator + dirName); cacheDir.mkdirs(); } return cacheDir; } 

Hay dos maneras

  1. Intención de la cámara .
  2. Cámara personalizada .

Usted está usando Camera Intent.

Nuevo Propósito (MediaStore.ACTION_IMAGE_CAPTURE);

MediaStore.ACTION_IMAGE_CAPTURE – Tipo de acción de intención para solicitar una imagen de una aplicación de cámara existente.

MediaStore.EXTRA_OUTPUT – Esta configuración requiere un objeto Uri que especifique la ruta y el nombre del archivo en el que desea guardar la imagen

¿Cómo guardar archivos multimedia ?

 private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; private Uri fileUri; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // create Intent to take a picture and return control to the calling application Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name // start the image capture Intent startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } 

Siga las instrucciones anteriores correctamente para evitar este duplicado.

La segunda opción es que usted necesita utilizar cámara personalizada .

Por favor lea este artículo completo para entender sobre la función de la cámara.

Insinuación:

En su startActivityForResult () escriba el código para mover la imagen desde la carpeta de la cámara a su carpeta Personalizada en lugar de guardar las imágenes en su carpeta personalizada.

Espero que esto pueda darle alguna información útil.

Eliminar la imagen de la carpeta de la cámara después de guardar esta imagen en una carpeta personalizada

  • ¿Por qué Camera necesita ser lanzado en onPause () en lugar de onstop () método de Activity?
  • Cámara Android: la aplicación superó la superficie NULL
  • Android: orientación / rotación de la pantalla para la vista previa de la cámara
  • Usando cámaras frontales y traseras simultáneamente android
  • ¿Dónde está android.camera.NEW_PICTURE definida?
  • Tamaños de vista previa de cámara compatibles para los teléfonos Android populares
  • Nueva visión API - Tamaño de imagen
  • Apache cordova aplicación de reinicio de la cámara en la galaxia S5
  • Cómo puedo dejar google maps api v2 ir directamente a mi ubicación
  • Cámara frontal tomar captura muy oscuro en android
  • Android: Cámara Asynctask con devolución de llamada de vista previa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.