web-dev-qa-db-fra.com

Passer Bitmap à une autre activité se termine par RunTimeException

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

19
OBX

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:

  1. Réduisez la taille du bitmap, cela peut ou non être une solution valide selon votre cas d'utilisation.
  2. Découpez le bitmap pour le transport et réassemblez-le du côté réception, vous devrez probablement écrire un service pour cela, et ce n'est pas terriblement efficace. Je l'ai fait une fois, pas recommandé.
  3. Passer uniquement l'URI pour le bitmap et le charger à nouveau sur l'activité de réception. C'est ainsi que l'intention de demander Android app appareil photo pour prendre une photo fonctionne - la photo est enregistrée dans le stockage et seul l'URI du fichier stocké est renvoyé.
  4. Si les 1ère et 2e activités sont dans le même processus, vous pouvez ignorer tout cela et enregistrer le bitmap dans un cache partagé, où il y a de très nombreuses bibliothèques pour accomplir cela.
20
Kai

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);
}
6
Mr Neo

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

1
JBirdVegas