outofmemoryerror outofmemory large images bitmaps android bitmap

android - outofmemory - Pasar Bitmap a otra actividad termina en RunTimeException



loading images android (3)

Estoy tratando de pasar Bitmap a otra actividad, y estoy mostrando la misma imagen de la otra actividad usando ImageView . Y así es como paso el mapa de bits.

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);

Y así es como recibo el valor:

Intent intent = getIntent(); bitmap= (Bitmap)intent.getParcelableExtra("BitmapImage"); ImageView im1 = (ImageView)findViewById(R.id.camOut); im1.setImageBitmap(bitmap);

Y mientras ejecuto la aplicación, aquí está el logcat que obtengo:

> 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)

En una question similar, la solución recomienda usar bibliotecas de carga de imágenes, ¿debo ir por eso o puedo solucionarlo fácilmente? Buscando respuestas profesionales. Gracias


La causa raíz se ha proporcionado en el registro:

Causado por: android.os.TransactionTooLargeException: tamaño de la parcela de datos 4915644 bytes

El límite máximo para el transporte de datos por Intent es de 1 MB, por lo que hay algunas formas de pasar un mapa de bits:

  1. Reduzca el tamaño del mapa de bits, esto puede o no ser una solución válida según su caso de uso.
  2. Corte el mapa de bits para el transporte y vuelva a montarlo en el extremo receptor, probablemente necesitará escribir un service para él, y no es muy eficiente. Lo hice una vez, no recomendado.
  3. Solo pase el URI para el mapa de bits y vuelva a cargarlo en la Actividad receptora. Así es como funciona la aplicación de la cámara Android de Intent.
  4. Si la primera y la segunda actividad están en el mismo proceso, puede omitir todo lo anterior y guardar el mapa de bits en un caché compartido, donde hay muchas bibliotecas para lograrlo.

No podemos pasar un Bitmap a través de intenciones extras. El motivo es que el bus de Inner Process Communication (IPC) tiene un límite de 1 mb. Este límite se aplica al Bundle que representa los extras del Intent .


Si pudieras capturar una imagen y guardarla en el almacenamiento local:

File out = new File(getFilesDir(), "newImage.jpg");

debe pasar el camino de out a otra actividad por:

bitIntent.putExtra("BitmapImage", out.getAbsolutePath());

en lugar de bitIntent.putExtra("BitmapImage", mBitmap);

Y en 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); }