Android: java.lang.OutOfMemoryError: no se pudo asignar una asignación de 23970828 bytes con 2097152 bytes libres y 2 MB hasta OOM


355

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 sale OutOfMemoryError error 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 log log:

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)

44
verifique los píxeles de la imagen, el ancho no debe exceder 1440 y la altura 2560, al hacer esto no se mostrará OutOfMemoryError
Pankaj Lilan

1
@PankajLilan ¿Dónde encontraste estos valores (1440 X 2560)? ¿Alguna referencia de documentaciones de Android?
LCJ

Respuestas:


525

Error de memoria insuficiente es el problema más común que se produce en Android, especialmente cuando se trata de mapas de bits. La máquina virtual Java (JVM) arroja este error cuando no se puede asignar un objeto 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

Android: BitmapFactory.decodeStream () sin memoria con un archivo de 400 KB con un montón libre de 2 MB

Cómo resolver problemas java.lang.OutOfMemoryError en Android

Android: java.lang.OutOfMemoryError

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.


1
¿Podría publicar cómo resolvió el problema? Porque tengo el mismo problema ... 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 otra parte del código puede estar discutiendo con esto ...
Aleksey Timoshchenko

66
La navegación de la aplicación se está volviendo muy lenta después de agregar esto.
Uma Achanta

10
android: hardwareAccelerated = "false" congelando su aplicación
Rahim Rahimov

1
Para cualquier persona que aún 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.
cjnash

66
¿por qué sugieres androide: hardwareAccelerated = "false ¿cuál es el beneficio de la misma??
batmaci

86

¿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" >

17
He intentado con este android: largeHeap = "true" pero
obtengo el

1
intente comprimir su imagen antes de poder usar este enlace para hacerlo tinyjpg.com
TSG

1
también puede comprimir png con este sitio
TSG

27

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


44
esta es la solución correcta, porque primero probé las soluciones anteriores, pero después de aplicarlas android:hardwareAccelerated="false", algunas animaciones como la sombra de diseño no funcionaban. Pero después de cambiar el tamaño de todos los problemas se resolvieron gracias! ¡+1 por esta pista!
Kaushal28

1
Esto solucionó mi problema. Gracias @petrus
Hùng Nguyễn

27

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

2
no funcionó, se bloqueó con el mismo error, cuando se usó Bitmap.createBitmap
Narendra Singh el

@ King lo siento (también pasé un tiempo para resolver este problema, y ​​es un trabajo para mí. Pero es solo una de las formas ... Hay muchos enfoques diferentes
Aleksey Timoshchenko,

2
¿Cuál es el propósito de android: hardwareAccelerated = "false" ?
IgorGanapolsky

@IgorGanapolsky Del documento oficial dice ... mira este enlace
Shylendra Madda

27

Esto debería funcionar

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

Cambie el tamaño de su imagen antes de la configuración a ImageView de esta manera:

Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);

donde el tamaño es el tamaño real de ImageView. Puede alcanzar el tamaño midiendo:

imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

y use el siguiente tamaño imageView.getMeasuredWidth()y imageView.getMeasuredHeight()para scaling.


He intentado con este android: largeHeap = "true" pero
obtengo el

Otro ejemplo de por qué esto no necesariamente funcionará (usando el almacenamiento privado de la aplicación): colocar un mapa de bits en res / drawable / puede dar el mismo error, pero no sucederá siempre. Colocar el mismo mapa de bits en res / drawable-xhdpi / ya no tendrá el error. Entonces, como respuesta, no es correcto por sí mismo.
CmosBattery

8

Use Glide Library y Override size para reducir el tamaño;

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);

6

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 añadir android:largeHeap="true"en AndroidManifest.xml entonces deshacerse 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">

5

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

4

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.


4

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, ganará "

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.

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí


3

Esto funcionó para mí: simplemente mueva las imágenes de la carpeta dibujable a drawable-hdpi.


¿Cuál es la explicación de esto? ¿Por qué funciona esta mudanza?
Harun

por favor explique por qué esto funciona ...?
X-Black ...

3

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

3

agregar esto a su manifiesto en aplicaciones? android: largeHeap = "true"


También tenemos una solución más: cambiar altura = altura * .75 y ancho = ancho * .75.
SAURABH OMER

2

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.



1

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

1

Me encontré con este problema cuando no eliminé mi actividad anterior al pasar a una nueva actividad. Lo arreglé confinish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();

1
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á problemas de memoria


1

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


1

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á.

1

Mi problema se resolvió después de agregar

 dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries true
        dexInProcess = true
    }

en el archivo Build.Gradle


Esto solo hace que su aplicación se
hinche

@ cricket_007 ¿Cuál es la consecuencia de eso, si lo hay?
Sreekanth Karumanaghat

1
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.....

0

Si carga 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();

0

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. Funcionó para mi. Definitivamente para usted será.


0
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


0

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 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á.


0

Realmente no recomiendo editar manifiestos como este

android: hardwareAccelerated = "false", android: largeHeap = "true"

Estas opciones causan un efecto de animación no uniforme en su aplicación. Además, 'liveData' o cambiando su DB local (Sqlite, Room) se activan lentamente. Es malo para la experiencia del usuario.

Entonces recomiendo RESIZE bitmap

A continuación se muestra el código de muestra

fun resizeBitmap(source: Bitmap): Bitmap {
      val maxResolution = 1000    //edit 'maxResolution' to fit your need
      val width = source.width
      val height = source.height
      var newWidth = width
      var newHeight = height
      val rate: Float

            if (width > height) {
                if (maxResolution < width) {
                    rate = maxResolution / width.toFloat()
                    newHeight = (height * rate).toInt()
                    newWidth = maxResolution
                }
            } else {
                if (maxResolution < height) {
                    rate = maxResolution / height.toFloat()
                    newWidth = (width * rate).toInt()
                    newHeight = maxResolution
                }
            }
            return Bitmap.createScaledBitmap(source, newWidth, newHeight, true)
 }

0

Si android: largeHeap = "true" no funcionó para usted, entonces

1:

Compresión de imagen. Estoy usando este sitio web

2:

Convierte imágenes a mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Estoy usando este sitio web

¡No elimine android: largeHeap = "true"!


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.