2013-08-22 2 views
2

J'ai une application dans laquelle un utilisateur peut télécharger une image pour son profil utilisateur. Dans mon application, je permets à l'utilisateur de recadrer une image en utilisant le cropper natif. Cependant, lorsque je tente de recadrer une grande image que je reçois l'erreur suivante dans mon Logcat:android.os.TransactionTooLargeException avec l'activité de recadrage

!!! FAILED BINDER TRANSACTION !!! 
Exception when starting activity com.example.somename/com.example.somename.Profile 
android.os.TransactionTooLargeException 

Je commence le métayer en utilisant le bit de code suivant:

Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
cropIntent.setDataAndType(imageFileUri , "image/*"); 
cropIntent.putExtra("crop", "true"); 
cropIntent.putExtra("aspectX", 1); 
cropIntent.putExtra("aspectY", 1); 
cropIntent.putExtra("outputX", 265); 
cropIntent.putExtra("outputY", 265); 
cropIntent.putExtra("scale", true); 
cropIntent.putExtra("return-data", true); 
startActivityForResult(cropIntent, PIC_CROP); 

puis dans mon onActivityResult le code suivant obtient l'image recadrée:

Bundle extras = data.getExtras(); 
Bitmap selectedBitmap = extras.getParcelable("data"); 
imgDisplayPic.setImageBitmap(selectedBitmap); 

Je suppose le problème est avec le métayer essayant d'envoyer un grand bitmap comme parcelable retour à mon activité. Y at-il un moyen de contourner cela? Ou une autre façon d'obtenir une image recadrée?

Merci d'avance pour toute aide.

Répondre

4

Si quelqu'un d'autre rencontre ce problème, j'ai réussi à le résoudre avec l'aide du lien suivant: http://www.androidworks.com/crop_large_photos_with_android. J'ai résolu le problème en implémentant l'option # 2 trouvée dans le lien.

Comme je l'avais soupçonné à l'origine, le problème était de renvoyer un bitmap de taille importante à partir du recadrage en tant que segmentable. Au lieu de cela, ce que j'ai fait (comme le suggère le lien) est d'enregistrer le contenu du recadrage dans un fichier temporaire, puis de lire ce contenu dans mon activité/fragment principal. Afin de ne pas envoyer le contenu de retour via parcelable le principal changement que je devais faire à mon code ci-dessus est

cropIntent.putExtra("return-data", false); 

et ajouté

cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempURI); 

où « tempURI » est le Uri du fichier temp où le contenu du rogneur sera sauvegardé. Ensuite, dans le onActivityResult vous devez supprimer la ligne suivante

Bitmap selectedBitmap = extras.getParcelable("data"); 

Au lieu de cela, vous aurez besoin du code pour lire le contenu de votre fichier temporaire. Espère que cela aide tous ceux qui rencontrent ce problème.

EDIT: Le lien est mort, essayez plutôt Internet Archive.

+3

le lien est mort. – alp

+0

@Cinvasion pouvez-vous fournir le lien une autre fois !!!! –