J'essaie de transmettre Bitmap à une autre activité et j'affiche la même image de l'autre activité en utilisant ImageView
. Et voici comment je passe le Bitmap.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == CAMERA_RESULT) {
File out = new File(getFilesDir(), "newImage.jpg");
if(!out.exists()) {
Toast.makeText(getBaseContext(),
"Error while capturing image", Toast.LENGTH_LONG)
.show();
return;
}
Bitmap mBitmap = BitmapFactory.decodeFile(out.getAbsolutePath());
Intent bitIntent = new Intent(this, CameraTake.class);
bitIntent.putExtra("BitmapImage", mBitmap);
startActivity(bitIntent);
Et voici comment je reçois la valeur:
Intent intent = getIntent();
bitmap= (Bitmap)intent.getParcelableExtra("BitmapImage");
ImageView im1 = (ImageView)findViewById(R.id.camOut);
im1.setImageBitmap(bitmap);
Et lors de l'exécution de l'application, voici le logcat que j'obtiens:
> 10-17 08:32:11.241 16762-16762/obx.com.futurister E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: obx.com.futurister, PID: 16762
Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { }} to activity {obx.com.futurister/obx.com.futurister.OptionChooser}: Java.lang.RuntimeException: Failure from system
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3699)
at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3742)
at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1393)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:148)
at Android.app.ActivityThread.main(ActivityThread.Java:5417)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Caused by: Java.lang.RuntimeException: Failure from system
at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1514)
at Android.app.Activity.startActivityForResult(Activity.Java:3917)
at Android.app.Activity.startActivityForResult(Activity.Java:3877)
at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:820)
at Android.app.Activity.startActivity(Activity.Java:4200)
at Android.app.Activity.startActivity(Activity.Java:4168)
at obx.com.futurister.OptionChooser.onActivityResult(OptionChooser.Java:75)
at Android.app.Activity.dispatchActivityResult(Activity.Java:6428)
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3695)
at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3742)
at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1393)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:148)
at Android.app.ActivityThread.main(ActivityThread.Java:5417)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Caused by: Android.os.TransactionTooLargeException: data parcel size 4915644 bytes
at Android.os.BinderProxy.transactNative(Native Method)
at Android.os.BinderProxy.transact(Binder.Java:503)
at Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:2657)
at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1507)
at Android.app.Activity.startActivityForResult(Activity.Java:3917)
at Android.app.Activity.startActivityForResult(Activity.Java:3877)
at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:820)
at Android.app.Activity.startActivity(Activity.Java:4200)
at Android.app.Activity.startActivity(Activity.Java:4168)
at obx.com.futurister.OptionChooser.onActivityResult(OptionChooser.Java:75)
at Android.app.Activity.dispatchActivityResult(Activity.Java:6428)
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3695)
at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3742)
at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1393)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:148)
at Android.app.ActivityThread.main(ActivityThread.Java:5417)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Dans un similaire question , la solution recommande d'utiliser des bibliothèques de chargement d'images, dois-je y aller ou cela peut-il être résolu facilement? Vous cherchez des réponses professionnelles. Merci
La cause première a été indiquée dans le journal:
Causé par: Android.os.TransactionTooLargeException: taille de la parcelle de données 4915644 octets
La limite maximale pour le transport de données par Intention est de 1 Mo. Il existe donc plusieurs façons de transmettre un bitmap:
Si vous pouviez capturer l'image et l'enregistrer sur le stockage local en:
File out = new File(getFilesDir(), "newImage.jpg");
vous devez passer le chemin de out
à une autre activité en:
bitIntent.putExtra("BitmapImage", out.getAbsolutePath());
au lieu de bitIntent.putExtra("BitmapImage", mBitmap);
Et dans secondActivity:
Intent intent = getIntent();
String imagePath = intent.getStringExtra("BitmapImage");
File imgFile = new File(imagePath);
if(imgFile.exists()){
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ImageView myImage = (ImageView) findViewById(R.id.camOut);
myImage.setImageBitmap(myBitmap);
}
Nous ne pouvons pas passer un Bitmap
dans les extras d'intention. La raison en est que le bus Inner Process Communication (IPC)
a une limite de 1 Mo. Cette limite s'applique au Bundle
qui représente les extras du Intent