0

J'essaie d'obtenir l'URI d'une photo prise avec le téléphone. J'essaye de convertir les données passées à "onActivityResult" en URI, puis convertis cet URI en une chaîne pour stocker dans ma base de données. Cette méthode fonctionne avec les vidéos, alors comment cela peut-il être réalisé avec une photo? Je reçois une exception de pointeur NULL lorsque j'essaie de convertir les données en URI. Dois-je utiliser une fonction différente pour convertir les données photo en URI? Mon code est le suivant:Android- Comment obtenir l'uri d'une photo prise

intention de bouton pour lancer l'enregistreur vidéo:

recordVideoButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent startVideoFunction = new Intent(); 
      startVideoFunction.setAction(MediaStore.ACTION_VIDEO_CAPTURE); 
      startActivityForResult(startVideoFunction, REQUEST_CODE_VIDEO); 
     } 
    }); 

intention de bouton pour lancer la capture photo:

takePhotosButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent startPhotoFunction = new Intent(); 
      startPhotoFunction.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(startPhotoFunction, REQUEST_CODE_PHOTO); 
     } 
    }); 

méthode onActivityResult:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    try { 
     switch (requestCode) { 
      case REQUEST_CODE_VIDEO: 

       videoUri = data.getData(); 

       String videoPath = videoUri.toString(); 
       videoDB.addVideoRow(videoPath); 

       //displayVideo.setVideoURI(videoUri); 
       //displayVideo.start(); 
       break; 

     case REQUEST_CODE_PHOTO: 

      photoUri = data.getData(); 

      String photoPath = photoUri.toString(); 
      videoDB.addPhotoRow(photoPath); 
      break; 
     } 
    }catch (NullPointerException e){ 
    //prevent crash when returning with Null data to mainactivity. 
    } 

} 

MISE À JOUR onActivityResult:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent 
data) { 
    // try { 
     switch (requestCode) { 
      case REQUEST_CODE_VIDEO: 

       videoUri = data.getData(); 

       String videoPath = videoUri.toString(); 
       videoDB.addVideoRow(videoPath); 

       //displayVideo.setVideoURI(videoUri); 
       //displayVideo.start(); 
       break; 

     case REQUEST_CODE_PHOTO: 

      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
      Uri tempUri = getImageUri(getApplicationContext(), photo); 

      File finalFile = new File(getRealPathFromURI(tempUri)); 

      String photoPath = finalFile.toString(); 


      videoDB.addPhotoRow(photoPath); 

      break; 
     } 
    //}catch (NullPointerException e){ 
    //prevent crash when returning with Null data to mainactivity. 
    //} 

} 


public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 

public String getRealPathFromURI(Uri uri) { 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
} 

Répondre

0

Pour obtenir Uri à partir de l'image: Convertissez le bitmap en Uri en utilisant le code mentionné ci-dessous. Vous pouvez toujours changer le format de compression Bitmap en PNG, mais évitez d'utiliser la ligne .compress car elle ne servira à rien. PNG ne sont pas compressés.

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); // Used for compression rate of the Image : 100 means no compression 
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "xyz", null); 
    return Uri.parse(path); 
} 

Pour obtenir le chemin absolu d'Uri utiliser cette méthode

public String getRealPathFromURI(Uri uri) { 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int id_uri = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(id_uri); 
} 

Hope this résout votre problème.

0

Vous êtes sur la mauvaise voie. Maintenant, vous ne sauvegarderez qu'une vignette de l'image prise et enregistrez-la dans un fichier. Alors que l'image complète originale est déjà dans un fichier sur le système de fichiers.

Dites à l'application de l'appareil photo dans quel but stocker l'image à prendre. Utilisez un putExtra pour EXTRA_OUTPUT.

+0

Salut greenapps. Je regardais ça et je suis tombé sur putExtra EXTRA_OUTPUT. Je crois que cela ajoute juste le Uri de la photo à l'intention envoyée à onActivityResult, ce qui résoudrait le problème. Cependant, je ne sais pas comment ajouter le Uri avec putExtra, cela vous dérangerait-il de montrer comment le faire? –

+0

Juste google pour des exemples. Il y en a des centaines sur ce site. Non, l'uri ne sera pas disponible en tant que paramètre du résultat onActivity. Vous devriez vous "souvenir" de l'uri utilisé. – greenapps

+0

J'ai mais j'ai encore du mal à adapter ces exemples à mon code. N'ai-je pas besoin du fichier actuel pour ajouter l'Uri à l'intention? –