2012-10-04 6 views
5

J'essaie de capturer une image à partir d'une application de caméra existante, enregistrer l'image dans un dossier personnalisé, et afficher la vignette et imageView. La caméra fournit la miniature aussi longtemps que je ne l'ai pas spécifié où enregistrer le fichier:Comment enregistrer la vignette de l'image ET enregistrer le fichier dans un dossier personnalisé sous Android

Je peux obtenir la vignette de l'intention de retour:

... 
    Intent i = = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i) 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent);  
    Bundle extras = intent.getExtras(); 
    Bitmap mImageBitmap = (Bitmap) extras.get("data"); 
} 

Ou je peux enregistrer le fichier dans un dossier spécifié (qui fonctionne très bien)

... 
    Intent i = = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    i.putExtra((MediaStore.EXTRA_OUTPUT, outputFileUri); 
    startActivityForResult(i) 
} 

mais la vignette n'est stockée plus dans les « données » extra intention, et lorsque je tente de récupérer la vignette, je reçois une erreur (ce qui est de mon LogCat)

10-04 06:30:14.463: E/AndroidRuntime(1967): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity: java.lang.NullPointerException 

Comme vous pouvez le voir, le champ renvoyé est null au lieu de la miniature de l'image. J'ai essayé de décoder le bitmap par la suite pour générer une vignette directement à partir du fichier, mais cela prend trop de temps (même en cas de sous-échantillonnage je n'ai plus d'erreur de mémoire), et il semble contre-intuitif de faire le travail deux fois. Aucune suggestion?

+0

Je pense que [cette réponse] [1] peut vous aider pour specifing répertoire de fichiers. [1]: http://stackoverflow.com/a/9734268/1172945 – Tugrul

Répondre

4

D'accord. Si vous passez un outputURI à l'intention, vous ne pourrez pas récupérer les données à partir de l'intention dans onActivityResult().

Je pense que seule option est d'utiliser le même outputURI pour afficher la vignette ..

essayer.

void captureImage(){ 
    File file = new File(Environment.getExternalStorageDirectory() 
    .getAbsolutePath() + "/MyFolder", "myImage"+ ".jpg"); 

mCapturedImagePath = file.getAbsolutePath(); 
     Uri outputFileUri = Uri.fromFile(file); 
    Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    startActivityForResult(i, CAMERA_REQUEST); 

}

onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_REQUEST) { 
      if (resultCode == RESULT_OK) { 

File file = new File(mCapturedImagePath); 
imageView.setImageURI(Uri.fromFile(file)); 

} 
+0

Merci pour votre suggestion, mais je teste le résultat de l'intention retournée dans la même activité (dans onActivityResult, en fait). La caméra ne renvoie pas de vignette si j'ai donné un i.putExtra (MediaStore.EXTRA_OUTPUT, outputFileUri); – keighty

+0

J'ai édité ma question pour le rendre plus clair. – keighty

+0

camera_request est un code de requête entier et lui donne la valeur que vous voulez. par exemple CAMERA_REQUEST = 1 –

0

Votre Bitmap mImageBitmap est une variable locale, que globale si vous voulez l'utiliser en dehors du onActivityResultFunction autrement définir l'image comme il

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_REQUEST) { 
     photo = (Bitmap) data.getExtras().get("data"); 
     imageView.setImageBitmap(photo); 
    } 
} 
+0

merci pour la réponse, mais le problème est pas que je ne peux pas utiliser le bitmap ailleurs, il est que la caméra ne renvoie pas la vignette quand je lui donne un nom de fichier de sortie – keighty

+0

essayez ceci Intention cameraIntent = new Intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (cameraIntent, CAMERA_REQUEST); –

+0

CAMERA_REQUEST est un entier renvoyé par la caméra. Pourquoi démarrer l'application de la caméra avec une autre intention quand elle vient de rentrer? – keighty

-1

essayer cette

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, CAMERA_REQUEST); 
Questions connexes