Arrêtez d'enregistrer des photos à l'aide d'une caméra native Android

J'utilise une caméra native Android et enregistre le fichier dans mon dossier de données de l'application (/mnt/sdcard/Android/data/com.company.app/files/Pictures/). En même temps, une autre copie de photo est enregistrée dans le dossier DCIM.

C'est mon code:

  • Comment ajouter de la documentation aux attributs personnalisés?
  • Android SDK - Pas de mise à l'échelle au centre du contact
  • GetView Vs. BindView dans un CursorAdapter personnalisé?
  • Est-ce la bonne façon de nettoyer la pile arrière de Fragment en laissant une pile profondément imbriquée?
  • Quelle est la fonction suivante de get (1) suivante?
  • Combien y-a-t'il de support pour -webkit-overflow-scrolling: touch
  • Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String formattedImageName = getDateString() + ".jpg"; File image_file = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES), formattedImageName); Uri imageUri = Uri.fromFile(image_file); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); startActivityForResult(intent, REQUEST_FROM_CAMERA); 

    Comment puis-je empêcher l'enregistrement d'une copie supplémentaire de l'image dans le dossier DCIM?

    Merci beaucoup

  • Android: l'éditeur XML par défaut ne s'ouvre plus
  • Comment cacher la barre d'état Android dans un jeu natif écrit avec gomobile
  • Android - lors de la sortie d'un WebView, l'audio continue de jouer
  • Comment réparer ceci: sur logcat - >> erreur de chargement /system/media/audio/ui/Effect_Tick.ogg ??
  • Comment appeler le menu contextuel
  • Google Maps Android API v2, comment supprimer Polylines de la carte?
  • 4 Solutions collect form web for “Arrêtez d'enregistrer des photos à l'aide d'une caméra native Android”

    Vérifiez ce code …

     private void FillPhotoList() { // initialize the list! GalleryList.clear(); String[] projection = { MediaStore.Images.ImageColumns.DISPLAY_NAME }; for(int i=0;i<projection.length;i++) Log.i("InfoLog","projection "+projection[0].toString()); // intialize the Uri and the Cursor, and the current expected size. Cursor c = null; Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Log.i("InfoLog","FillPhoto Uri u "+u.toString()); // Query the Uri to get the data path. Only if the Uri is valid. if (u != null) { c = managedQuery(u, projection, null, null, null); } // If we found the cursor and found a record in it (we also have the id). if ((c != null) && (c.moveToFirst())) { do { // Loop each and add to the list. GalleryList.add(c.getString(0)); // adding all the images sotred in the mobile phone(Internal and SD card) } while (c.moveToNext()); } Log.i(INFOLOG,"gallery size "+ GalleryList.size()); } 

    Et c'est là que la méthode fait toute la magie

      /** Method will check all the photo is the gallery and delete last captured and move it to the required folder. */ public void movingCapturedImageFromDCIMtoMerchandising() { // This is ##### ridiculous. Some versions of Android save // to the MediaStore as well. Not sure why! We don't know what // name Android will give either, so we get to search for this // manually and remove it. String[] projection = { MediaStore.Images.ImageColumns.SIZE, MediaStore.Images.ImageColumns.DISPLAY_NAME, MediaStore.Images.ImageColumns.DATA, BaseColumns._ID,}; // intialize the Uri and the Cursor, and the current expected size. for(int i=0;i<projection.length;i++) Log.i("InfoLog","on activityresult projection "+projection[i]); //+" "+projection[1]+" "+projection[2]+" "+projection[3] this will be needed if u remove the for loop Cursor c = null; Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Log.i("InfoLog","on activityresult Uri u "+u.toString()); if (CurrentFile != null) { // Query the Uri to get the data path. Only if the Uri is valid, // and we had a valid size to be searching for. if ((u != null) && (CurrentFile.length() > 0)) { //****u is the place from data will come and projection is the specified data what we want c = managedQuery(u, projection, null, null, null); } // If we found the cursor and found a record in it (we also have the size). if ((c != null) && (c.moveToFirst())) { do { // Check each area in the gallery we built before. boolean bFound = false; for (String sGallery : GalleryList) { if (sGallery.equalsIgnoreCase(c.getString(1))) { bFound = true; Log.i("InfoLog","c.getString(1) "+c.getString(1)); break; } } // To here we looped the full gallery. if (!bFound) //the file which is newly created and it has to be deleted from the gallery { // This is the NEW image. If the size is bigger, copy it. // Then delete it! File f = new File(c.getString(2)); // Ensure it's there, check size, and delete! if ((f.exists()) && (CurrentFile.length() < c.getLong(0)) && (CurrentFile.delete())) { // Finally we can stop the copy. try { CurrentFile.createNewFile(); FileChannel source = null; FileChannel destination = null; try { source = new FileInputStream(f).getChannel(); destination = new FileOutputStream(CurrentFile).getChannel(); destination.transferFrom(source, 0, source.size()); } finally { if (source != null) { source.close(); } if (destination != null) { destination.close(); } } } catch (IOException e) { // Could not copy the file over. ToastMaker.makeToast(this, "Error Occured", 0); } } //****deleting the file which is in the gallery Log.i(INFOLOG,"imagePreORNext1 "+imagePreORNext); Handler handler = new Handler(); //handler.postDelayed(runnable,300); Log.i(INFOLOG,"imagePreORNext2 "+imagePreORNext); ContentResolver cr = getContentResolver(); cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, BaseColumns._ID + "=" + c.getString(3), null); break; } } while (c.moveToNext()); } } } 

    Vous pouvez utiliser les éléments suivants: Premièrement, nous obtenons la dernière image enregistrée en vérifiant quelle était la dernière image modifiée. Ensuite, vérifiez si le dernier temps modifié est dans les dernières secondes. Vous devrez peut-être également vérifier l'emplacement exact de la caméra où l'image stocke.

     private boolean deleteLastFromDCIM() { boolean success = false; try { File[] images = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera").listFiles(); File latestSavedImage = images[0]; for (int i = 1; i < images.length; ++i) { if (images[i].lastModified() > latestSavedImage.lastModified()) { latestSavedImage = images[i]; } } // OR JUST Use success = latestSavedImage.delete(); success = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera/" + latestSavedImage.getAbsoluteFile()).delete(); return success; } catch (Exception e) { e.printStackTrace(); return success; } } 

    Malheureusement, certains téléphones intelligents enregistrent des images dans un autre dossier tel que DCIM / 100MEDIA. Donc, ne peut pas compter sur cette solution. Je préfère utiliser de cette façon:

     String[] projection = new String[] { MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, MediaStore.Images.ImageColumns.DATE_TAKEN, MediaStore.Images.ImageColumns.MIME_TYPE}; final Cursor cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"); if(cursor != null){ cursor.moveToFirst(); // you will find the last taken picture here and can delete that } 

    J'ai essayé de savoir si une deuxième copie existe et de supprimer la copie. J'ai utilisé le code ci-dessus pour trouver la dernière image prise.

    Remarque: n'utilisez pas cursor.close(); Après avoir utilisé managedQuery , laissez le curseur pour que le système Android gère et n'appelle pas cela. Vous pouvez voir managedQuery ()

    Notice2: la méthode managedQuery est obsolète et il doit être évité, implémentez plutôt CursorLoaders .

    Une belle solution par Parth. Mais il est bon pour Samsung de garder des images dans DCIM / Camera. Certains téléphones – Sony Ericssons, HTCs les conservent dans des dossiers comme DCIM / 100MEDIA, DCIM / 100ANDRO, j'ai donc légèrement modifié le code:

      private boolean deleteLastFromDCIM() { boolean success = false; try { //Samsungs: File folder = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera"); if(!folder.exists()){ //other phones: File[] subfolders = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM").listFiles(); for(File subfolder : subfolders){ if(subfolder.getAbsolutePath().contains("100")){ folder = subfolder; break; } } if(!folder.exists()) return false; } File[] images = folder.listFiles(); File latestSavedImage = images[0]; for (int i = 1; i < images.length; ++i) { if (images[i].lastModified() > latestSavedImage.lastModified()) { latestSavedImage = images[i]; } } success = latestSavedImage.delete(); return success; } catch (Exception e) { e.printStackTrace(); return success; } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.