imagen - Android: java.lang.OutOfMemoryError: no se pudo asignar una asignación de 23970828 bytes con 2097152 bytes libres y 2 MB hasta OOM
convertir imagen a bitmap android (28)
Problema: no se pudo asignar una asignación de 37748748 bytes con 16777120 bytes libres y 17 MB hasta OOM
Solución: 1. abra su archivo de manifiesto 2. dentro de la etiqueta de la aplicación, simplemente agregue debajo de dos líneas
android:hardwareAccelerated="false"
android:largeHeap="true"
Ejemplo:
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:largeHeap="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
Quiero mostrar la imagen de mapa de bits en ImageView desde la tarjeta SD que ya está almacenada. Después de ejecutar mi aplicación se bloquea y aparece el error OutOfMemoryError de:
(java.lang.OutOfMemoryError: no se pudo asignar una asignación de 23970828 bytes con 2097152 bytes libres y 2 MB hasta OOM)
No tengo idea o por qué está fuera de memoria. Creo que el tamaño de mi imagen es muy grande, así que intenté cambiarlo.
Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
Object element = it.next();
String objElement = element.toString();
Log.e("objElement ", " = " + objElement);
final ImageView imageView = new ImageView (getContext());
final ProgressBar pBar = new ProgressBar(getContext(), null,
android.R.attr.progressBarStyleSmall);
imageView.setTag(it);
pBar.setTag(it);
imageView.setImageResource(R.drawable.img_placeholder);
pBar.setVisibility(View.VISIBLE);
if (objElement.endsWith(mp3_Pattern)) {
Log.e("Mp3 ", " ends with ");
pBar.setVisibility(View.GONE);
imageView.setImageResource(R.drawable.audio_control);
}
if (objElement.endsWith(png_Pattern)) {
Bitmap bitmap = BitmapFactory.decodeFile(objElement);
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
int x = (bitmap.getWidth() - size) / 2;
int y = (bitmap.getHeight() - size) / 2;
Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
Log.e("bitmap_Resul "," = "+ bitmap_Resul);
if (bitmap_Resul != bitmap) {
bitmap.recycle();
}
imageView.setImageBitmap(bitmap_Resul);
Log.e("png_Pattern ", " ends with ");
Log.e(" bitmap "," = " + bitmap);
}
holder.linearLayout.addView(imageView);
holder.linearLayout.addView(pBar);
La información del gato de registro:
08-27 14:11:15.307 1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.tazeen.classnkk, PID: 1857
java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
at android.widget.AbsListView.obtainView(AbsListView.java:2347)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillDown(ListView.java:698)
at android.widget.ListView.fillFromTop(ListView.java:759)
at android.widget.ListView.layoutChildren(ListView.java:1659)
at android.widget.AbsListView.onLayout(AbsListView.java:2151)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
¿Has intentado agregar esto a tu manifiesto bajo aplicaciones?
android:largeHeap="true"
?
Me gusta esto
<application
android:name=".ParaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:largeHeap="true" >
En algunos casos (por ejemplo, operaciones en un bucle), el recolector de basura es más lento que su código. Puede usar un método auxiliar de esta respuesta para esperar al recolector de basura .
En realidad, puede agregar en su manifiesto estas líneas
android:hardwareAccelerated="false"
,
android:largeHeap="true"
está funcionando para algunas situaciones, pero tenga en cuenta que la otra parte del código puede estar discutiendo con esto.
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
Esto debería funcionar
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
Esto funcionó para mí: simplemente mueva las imágenes de la carpeta dibujable a drawable-hdpi.
He descubierto que las imágenes en la carpeta ''dibujable'' se convertirán en una imagen mucho más grande en teléfonos de alta definición. Por ejemplo, una imagen de 200k se volverá a muestrear a una resolución más alta, como 800k o 32000k. Tuve que descubrir esto por mi cuenta y hasta la fecha no he visto documentación para esta trampa de memoria de montón. Para evitar esto, puse todo en una carpeta drawable-nodpi (además de usar ''opciones'' en BitmapFactory en función del montón de dispositivos en particular). No puedo permitirme que el tamaño de mi aplicación se hinche con múltiples carpetas dibujables, particularmente porque el rango de defs de pantalla es tan amplio ahora. Lo complicado es que el estudio ahora no indica específicamente la carpeta ''drawable-nodpi'' como tal en la vista del proyecto, solo muestra una carpeta ''dibujable''. Si no tiene cuidado, cuando suelta una imagen en esta carpeta en el estudio, en realidad no se colocará en el drawpirable-nodpi:
Careful here ''backgroundtest'' did not actually go to drawable-nodpi and will
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.
Asegúrese de hacer clic en la carpeta nodpi en el cuadro de diálogo, ya que la vista del proyecto no le mostrará todas las carpetas dibujables por separado como solía hacerlo, por lo que no será inmediatamente evidente que se equivocó. Studio recreó la vainilla ''dibujable'' en algún momento para mí después de haberlo eliminado hace mucho tiempo:
He resuelto este problema cambiando el tamaño de la imagen a un tamaño más bajo. Estoy usando la forma xamarin. La disminución del tamaño de la imagen PNG resolvió el problema.
Me encontré con este problema cuando no eliminé mi actividad anterior al pasar a una nueva actividad.
Lo arreglé con
finish();
Intent goToMain = new Intent(this,MainActivity.class);
startActivity(goToMain);
finish();
Mi problema se resolvió después de agregar
dexOptions {
incremental true
javaMaxHeapSize "4g"
preDexLibraries true
dexInProcess = true
}
en el archivo Build.Gradle
Para mí, el problema era que mi archivo .png se estaba descomprimiendo para ser un mapa de bits realmente enorme en la memoria, porque la imagen tenía dimensiones muy grandes (aunque el tamaño del archivo era pequeño).
Entonces, la solución fue simplemente cambiar el tamaño de la imagen :)
Prueba el más simple. Tal vez su aplicación se está bloqueando porque el tamaño de su imagen (en MB) es demasiado grande, por lo que no está asignando espacio para eso. Entonces, antes de pegar su imagen en dibujable, simplemente reduzca el tamaño con cualquier software de visualización o si está tomando una imagen de la galería en el tiempo de ejecución que antes de guardarla, comprima su mapa de bits. A mi me funciono. Definitivamente para usted será.
Si sube una imagen, intente reducir la calidad de la imagen, que es el segundo parámetro del mapa de bits. Esta fue la solución en mi caso. Anteriormente era 90, luego probé con 60 (como está en el código a continuación ahora).
Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();
Soy un novato en el desarrollo de Android, pero espero que mi solución ayude, funciona perfectamente en mi condición. Estoy usando Imageview y establezco su fondo en "src" porque estoy tratando de hacer una animación de cuadro. Recibí el mismo error pero cuando intenté codificar esto funcionó
int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
imgView.SetImageResource(ImageID);
AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
animation.Start();
animation.Dispose();
Su aplicación se bloquea porque el tamaño de su imagen (en MB o KB) es demasiado grande, por lo que no está asignando espacio para eso. Entonces, antes de pegar su imagen en dibujable, simplemente reduzca el tamaño.
O
Puede agregar Siguiente en la etiqueta de la aplicación en Manifest.xml
android:hardwareAccelerated="false"
android:largeHeap="true"
android:allowBackup="true"
Después de agregar esta aplicación no se bloqueará.
- siempre use imágenes de menos tamaños en la aplicación.
- Si agrega grandes tamaños de imágenes en la aplicación, debe agregar el syntex anterior, pero el tamaño de la aplicación aumentará.
Supongo que quieres usar esta imagen como un icono. Como Android te está diciendo, tu imagen es demasiado grande. Lo que solo necesita hacer es escalar su imagen para que Android sepa qué tamaño de la imagen usar y cuándo según la resolución de la pantalla. Para lograr esto, en Android Studio: 1. haga clic con el botón derecho en la carpeta res, 2. seleccione Image Asset 3. Seleccione icon Type 4. Asigne un nombre al icono 5. Seleccione Image on Asset Type 6. Recorte su imagen Haga clic en Siguiente y termine . En su código fuente o XML, simplemente consulte la imagen que ahora se ubicará en la carpeta de diseño o mipmap según el tipo de activo seleccionado. El error desaparecerá.
Tengo debajo del error
"E / art: Throwing OutOfMemoryError" Error al asignar una asignación de bytes 47251468 con 16777120 bytes libres y 23MB hasta OOM "
después de agregar
android:largeHeap="true"
en
AndroidManifest.xml
, me deshago de todos los errores
<application
android:allowBackup="true"
android:icon="@mipmap/guruji"
android:label="@string/app_name"
android:supportsRtl="true"
android:largeHeap="true"
android:theme="@style/AppTheme">
Tienes que cambiar el tamaño del objeto en dibujable. Es demasiado grande para que lo muestre Android. Por ejemplo, si está configurando una imagen, pruebe con menos píxeles. Esto funciona para mi. Gracias. :)
Use Glide Library y Override size para reducir el tamaño;
imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
Yo también tuve el problema.
Lo mismo con la mayoría de los anteriores. El problema es causado por una gran imagen.
Simplemente cambie el tamaño de algunas imágenes y no necesite cambiar ningún código.
agregar esto a su manifiesto en aplicaciones? android: largeHeap = "true"
Cambie el tamaño de su imagen antes de la configuración a ImageView de esta manera:
Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);
donde el tamaño es el tamaño real de ImageView. Puede alcanzar el tamaño midiendo:
Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);
y use el siguiente tamaño
imageView.getMeasuredWidth()
e
imageView.getMeasuredHeight()
para
scaling
.
OutOfMemoryError es el problema más común que ocurre en Android, especialmente cuando se trata de mapas de bits. La máquina virtual Java (JVM) arroja este error cuando un objeto no se puede asignar debido a la falta de espacio en la memoria y, además, el recolector de basura no puede liberar espacio.
Como lo menciona Aleksey, puede agregar las siguientes entidades en su archivo de manifiesto
android:hardwareAccelerated="false"
,
android:largeHeap="true"
funcionará para algunos entornos.
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
definitivamente debería leer algunos de los conceptos del desarrollador de androides, especialmente aquí: mostrar mapas de bits de manera eficiente
Lea los 5 temas y vuelva a escribir su código. Si todavía no funciona, estaremos encantados de ver qué ha hecho mal con el material del tutorial.
Aquí algunas de las posibles respuestas para este tipo de errores en SOF
Cómo resolver problemas java.lang.OutOfMemoryError en Android
Android: java.lang.OutOfMemoryError
Solución para OutOfMemoryError: el tamaño del mapa de bits excede el presupuesto de VM
Editar: De los comentarios de @cjnash
Para cualquier persona que todavía tenga fallas después de agregar esta línea, intente pegar su imagen en su carpeta res / drawable-xhdpi / en lugar de su res / drawable / y podría resolver su problema.
Soluton intente esto en su archivo de manifiesto y use Glide Library
compile ''com.github.bumptech.glide: glide: 3.7.0''
**Use Glide Library and Override size to less size;**
if (!TextUtils.isEmpty(message.getPicture())) {
Glide.with(mContext).load(message.getPicture())
.thumbnail(0.5f)
.crossFade()
.transform(new CircleTransform(mContext))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.imgProfile);
}
android: hardwareAccelerated = "false"
android: largeHeap = "true"
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
Usa esta biblioteca
compile ''com.github.bumptech.glide:glide:3.7.0''
Está funcionando feliz codificación
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
public class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
// TODO this could be acquired from the pool too
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;
float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();
Luego, en la etiqueta Appliaction, agregue largeheapsize = "true
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);
50/100 si uno usa 100, entonces la resolución original puede detener las aplicaciones por falta de memoria.
si 50 o menos de 100, esto será una resolución del 50% o menos de 100, por lo que evitará un problema de falta de memoria
Last but not the least....
Try Method One:
Simple Add these lines of code in the gradle file
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
Example:
android {
compileSdkVersion XX
buildToolsVersion "28.X.X"
defaultConfig {
applicationId "com.example.xxxxx"
minSdkVersion 14
targetSdkVersion 19
}
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
}
*******************************************************************
Method Two:
Add these two lines of code in manifest file...
android:hardwareAccelerated="false"
android:largeHeap="true"
Example:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:hardwareAccelerated="false"
android:largeHeap="true"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
It will Work for sure any of these cases.....