2016-08-30 2 views
0

Qu'est-ce que je fais mal ici? J'essaie d'appeler l'intention d'obtenir une image en taille réelle:Image Intent Zéro Longueur Image

takePictureIntent

private void takePictureIntent(int request) { 
    final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) { 
     File file = null; 

     try { 
      file = createImageFile(request); 
     } catch (Exception e) { 
      showErrorDialog(getString(R.string.error), getString(R.string.error_saving_picture)); 
      Log.e(TAG, "Error while creating image file."); 
     } 

     if (file != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
      startActivityForResult(takePictureIntent, request); 
     } else { 
      Log.e(TAG, "Error while creating image file."); 
      showErrorDialog(getString(R.string.error), getString(R.string.error_saving_picture)); 
     } 
    } 
} 

createImageFile

private File createImageFile(final int request) { 
    final File storageDir = new File(activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES), getString(R.string.app_name)); 

    if (!storageDir.exists()) { 
     if (!storageDir.mkdirs()) { 
      Log.e(TAG, "Cannot create parent folders."); 
      return null; 
     } 
    } 

    File file = null; 

    try { 
     file = File.createTempFile("test_", ".jpg", storageDir); 
    } catch (Exception e) { 
     Log.e(TAG, "Error while creating temp file."); 
    } 

    fileProduct = file; 

    return file; 
} 

onActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_IMAGE_PRODUCT) { 

    if (fileProduct == null ||!fileProduct.exists() ||fileProduct.length() == 0) { 
     showErrorDialog(getString(R.string.error), getString(R.string.error_taking_product_picture)); 
     return; 
    } 
} 

Parfois (oui, parfois) la longueur du fichier résultant est 0. Je sais avec certitude que les dossiers dans le contexte de l'application privée existent et les fichiers d'image ainsi (avec une longueur> 0). Pourriez-vous s'il vous plaît fournir de l'aide? Je suis sur 6.0 sur Nexus 5X.

Répondre

1

Je voudrais commencer par se débarrasser de File.createTempFile(). Vous n'en avez pas besoin, cela fait perdre du temps, et certaines applications d'appareils photo pourraient vouloir ne pas stocker la photo dans ce fichier (puisque le fichier est déjà là). Générez simplement un nom de fichier unique. Cela aidera progressivement votre compatibilité.

De même, vous devez vous assurer que vous maintenez fileProduct dans l'état d'instance enregistré Bundle, car le processus de votre application peut être interrompu lorsque l'application de caméra est au premier plan.

Cependant, en général, ACTION_IMAGE_CAPTURE n'est pas très fiable. Vous déléguez le travail à l'une des centaines d'applications de caméra possibles, et certaines de ces applications ont des bogues. Un tel bug ignore EXTRA_OUTPUT. Donc, dans onActivityResult(), si vous déterminez que vous avez une valeur valide fileProduct, mais qu'il n'y a pas de fichier, appelez data.getData() et voyez si vous avez un Uri là. Dans ce cas, l'application de l'appareil photo peut avoir stocké la photo à l'emplacement identifié par Uri, et vous pouvez utiliser ContentResolver et DocumentFile pour essayer de travailler avec cette Uri.

+0

Ok pour 1 et 2, mais je ne m'attendrais pas à un tel bug sur une application appareil photo Nexus ... Ce code fonctionne très bien sur un Motorola Moto G 2014 avec Lollipop. J'appelle startActivityForResult à partir d'un fragment si cela peut être utile. Ce que je ne comprends pas, c'est que l'image est là, le système de fichiers l'a ... sanglot. – Jumpa

+0

@Jumpa: Alors votre problème n'est pas un fichier de longueur nulle. Ma conjecture est que 'fileProduct' est' null', parce que votre processus a été terminé en arrière-plan. – CommonsWare

+0

J'ai testé le fichier existe (je veux dire la méthode existe()) et n'est pas nul. – Jumpa

0

En utilisant ceci:

final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
file = new File(storageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 

au lieu de

File.createTempFile() 

semble comme par magie pour résoudre le problème. Merci à CommonsWare pour (en quelque sorte) me pointant dans la bonne direction.