Question capturer des images avec MediaStore.ACTION_IMAGE_CAPTURE intention dans Android


Je capture des images en utilisant l'intention MediaStore.ACTION_IMAGE_CAPTURE. cela fonctionne bien dans la plupart des appareils. mais il ne fonctionne pas correctement dans certains appareils Android récents comme prévu.

mon intention est de capturer l'image en utilisant l'appareil photo et l'envoyer au serveur, mais pas pour stocker cette image dans la galerie par défaut de l'appareil.

**: Lorsque je capture l'image, il renvoie une autre image de la galerie dans la méthode onActivityResult au lieu de l'image capturée dans certains appareils Android récents. J'utilise le code ci-dessous pour capturer et stocker des images.

public void launchCamera(View v) {
    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camera, CAMERA_PIC_REQUEST );
}

Dans la méthode onActivityResult,

String[] projection = { MediaStore.Images.ImageColumns.SIZE,
                    MediaStore.Images.ImageColumns.DISPLAY_NAME,
                    MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, };
            Cursor c = null;
            Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            try {
                if (u != null) {
                    c = managedQuery(u, projection, null, null, null);
                }
                if ((c != null) && (c.moveToLast())) {
                    Bitmap thumbnail = getBitMapFromLocalPath(c.getString(2), 3);
                    idsImagesgot.add(thumbnail);
                    ContentResolver cr = getContentResolver();
                    cr.delete( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            BaseColumns._ID + "=" + c.getString(3), null);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }

Quelqu'un peut-il m'aider à cet égard.

Merci d'avance.

Sathish


10
2017-10-18 10:45


origine


Réponses:


Les photos prises par ACTION_IMAGE_CAPTURE ne sont pas enregistrées automatiquement dans le MediaStore sur tous les appareils.

Le guide officiel d'Android donne cet exemple: http://developer.android.com/guide/topics/media/camera.html#intent-receive Mais cela ne fonctionne pas non plus sur tous les appareils.

La seule méthode fiable dont je suis conscient consiste à enregistrer le chemin d'accès à l'image dans une variable locale. Attention, votre application peut être supprimée en arrière-plan (pendant que l'application photo est en cours d'exécution). Vous devez donc enregistrer le chemin pendant onSaveInstanceState.

Modifier après le commentaire:

Créez un nom de fichier temporaire où la photo sera stockée au démarrage de l'intention.

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 est une chaîne, un domaine de votre activité. Vous devez le sauvegarder de cette façon:

@Override
public void onSaveInstanceState(Bundle bundle)
{
 super.onSaveInstanceState(bundle);
 bundle.putString("fileName", fileName);
}

et le récupérer dans onCreate ():

public void onCreate(Bundle savedInstanceState)
{
 if (savedInstanceState != null)
  fileName = savedInstanceState.getString("fileName");
 // ...
}

Maintenant, au moment de onActivityResult, vous connaissez le nom du fichier où la photo a été stockée (fileName). Vous pouvez faire tout ce que vous voulez avec, puis le supprimer.

2013-09-19 edit: Il semble que certaines applications de caméra ignorent le putExtra uri et stockent la photo dans un endroit différent. Donc, avant d'utiliser la valeur de fileName vous devriez vérifier si l'intention est nulle ou non. Si vous obtenez une intention non nulle, vous devriez alors préférer intent.getData() plus de fileName. Utilisation fileName comme solution de sauvegarde uniquement lorsque cela est nécessaire.


32
2017-10-18 11:32



Ma méthode onActivityResult () ressemble à ceci et fonctionne pour obtenir l'image de MediaStore.ACTION_IMAGE_CAPTURE:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");
    }
}

3
2018-01-07 22:17