Android: java.lang.OutOfMemoryError: falha ao alocar uma alocação de 23970828 bytes com 2097152 bytes livres e 2 MB até a OOM


355

Quero mostrar a imagem Bitmap no ImageView do cartão SD que já está armazenado. Após a execução, meu aplicativo está travando e recebendo o erro OutOfMemoryError de:

(java.lang.OutOfMemoryError: falha ao alocar uma alocação de 23970828 bytes com 2097152 bytes livres e 2 MB até o OOM)

Não faço ideia ou por que está sem memória. Eu acho que o tamanho da minha imagem é muito grande, então tentei alterá-lo.

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

As informações do gato de 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)

4
verificar os pixels da imagem, a largura não deve exceder 1440 e altura 2560, ao fazer isso, ele não vai aparecer OutOfMemoryError
Pankaj Lilan

11
@PankajLilan Onde você encontrou esses valores (1440 X 2560)? Alguma referência de documentação do Android?
LCJ 14/07

Respostas:


525

Erro de falta de memória é o problema mais comum ocorrido no Android, ao lidar especialmente com bitmaps. Este erro é lançado pela Java Virtual Machine (JVM) quando um objeto não pode ser alocado devido à falta de espaço na memória e também, o coletor de lixo não pode liberar algum espaço.

Conforme mencionado por Aleksey, você pode adicionar abaixo entidades no seu arquivo de manifesto android:hardwareAccelerated="false", android:largeHeap="true"ele funcionará para alguns ambientes.

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

você deve ler definitivamente alguns dos conceitos de desenvolvedores do Android, especialmente aqui: Exibindo bitmaps com eficiência

Leia todos os 5 tópicos e reescreva seu código novamente. Se ainda assim não funcionar, ficaremos felizes em ver o que você fez de errado com o material do tutorial.

Aqui estão algumas das respostas possíveis para esse tipo de erro no SOF

Android: BitmapFactory.decodeStream () sem memória com um arquivo de 400 KB com heap livre de 2 MB

Como resolver o problema de java.lang.OutOfMemoryError no Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Solução para OutOfMemoryError: o tamanho do bitmap excede o orçamento da VM

Edit: Dos comentários de @cjnash

Para quem ainda teve falhas depois de adicionar essa linha, tente colocar sua imagem na pasta res / drawable-xhdpi / em vez de res / drawable-xhdpi /, em vez de res / drawable /, e isso pode resolver o problema.


11
Você poderia postar como resolveu o problema? Porque eu tenho o mesmo problema ... Na verdade, você pode adicionar no seu manifesto estas linhas android: hardwareAccelerated = "false", android: largeHeap = "true" está funcionando para algumas situações, mas saiba que outra parte do código pode estar discutindo com isso ...
Aleksey Timoshchenko

6
a navegação do aplicativo está ficando muito lenta depois de adicionar isso.
Uma Achanta

10
android: hardwareAccelerated = "false" congelando seu aplicativo
Rahim Rahimov

11
Para quem ainda teve falhas após adicionar essa linha, tente colocar sua imagem na pasta res / drawable-xhdpi / em vez de res / drawable-xhdpi /, em vez de res / drawable /, e isso pode resolver o problema.
cjnash

6
por que você iria sugerir android: hardwareAccelerated = "false qual é o benefício disso?
batmaci

86

você tentou adicionar isso ao seu manifesto em aplicativos? android:largeHeap="true"?

como isso

  <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
Eu tentei com este android: largeHeap = "true", mas recebendo mesmo erro
androidTag

11
tente compactar sua imagem antes de poder usar este link para fazê-lo tinyjpg.com
TSG

11
você pode png também compressa com este site
TSG

27

Para mim, o problema era que meu arquivo .png estava sendo descompactado para ser um bitmap realmente enorme na memória, porque a imagem tinha dimensões muito grandes (mesmo que o tamanho do arquivo fosse pequeno).

Portanto, a correção foi simplesmente redimensionar a imagem :)


4
esta é a solução correta, porque tentei primeiramente as soluções acima, mas após a aplicação android:hardwareAccelerated="false", algumas animações como a sombra do layout não estavam funcionando. Mas depois de redimensionar todos os problemas foram resolvidos, obrigado! +1 para esta dica!
Kaushal28

11
isso corrigiu meu problema. Obrigado @petrus
Nguyễn

27

Na verdade, você pode adicionar no seu manifesto essas linhas android:hardwareAccelerated="false", android:largeHeap="true"ele está funcionando para algumas situações, mas esteja ciente de que a outra parte do código pode estar discutindo isso.

<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
não funcionou, ele travou com o mesmo erro, quando usado Bitmap.createBitmap
Narendra Singh

@King desculpe (eu também passei algum tempo a fim de resolver esta questão, e é trabalho para mim Mas é apenas uma das formas ... Há um monte de abordagem diferente.
Aleksey Timoshchenko

2
Qual é o objetivo do android: hardwareAccelerated = "false" ?
IgorGanapolsky 13/10

@IgorGanapolsky Do documento oficial diz .. veja este link
Shylendra Madda

27

Isso deve funcionar

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

Redimensione sua imagem antes da configuração para o ImageView da seguinte maneira:

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

onde size é o tamanho real do ImageView. Você pode atingir o tamanho medindo:

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

e use o próximo tamanho imageView.getMeasuredWidth()e imageView.getMeasuredHeight()para scaling.


Eu tentei com este android: largeHeap = "true", mas recebendo mesmo erro
androidTag

Um outro exemplo de por que isso não necessariamente funciona (usando armazenamento de aplicativo privado): Colocar um bitmap em res / drawable / pode dar o mesmo erro, mas isso não acontece sempre. Colocar o mesmo bitmap em res / drawable-xhdpi / não terá mais o erro. Então, como resposta, não está correto por si só.
CmosBattery

8

Use Glide Library e Override size para menos tamanho;

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

6

Fiquei abaixo do erro

"E / art: Throwing OutOfMemoryError" Falha ao alocar uma alocação de 47251468 bytes com 16777120 bytes livres e 23 MB até o OOM "

depois de adicionar android:largeHeap="true"em AndroidManifest.xml então eu livrar de todos os erros

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">

4

Resolvi esse problema redimensionando a imagem para um tamanho menor. Estou usando o formulário xamarin. diminuir o tamanho da imagem PNG resolveu o problema.


4

Problema: falha ao alocar uma alocação de 37748748 bytes com 16777120 bytes livres e 17 MB até o OOM

Solução: 1. abra o arquivo de manifesto 2. dentro da tag do aplicativo, basta adicionar abaixo de duas linhas

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

Exemplo:

 <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

Descobri que as imagens na pasta 'drawable' serão convertidas em uma imagem muito maior em telefones de alta definição. Por exemplo, uma imagem de 200k será reamostrada para uma resolução mais alta, como 800k ou 32000k. Eu tive que descobrir isso sozinho e, até o momento, não vi documentação para essa armadilha de memória heap. Para evitar isso, coloquei tudo em uma pasta drawable-nodpi (além de usar 'opções' no BitmapFactory com base no heap do dispositivo específico). Não posso me dar ao luxo de ter o tamanho do meu aplicativo inchado com várias pastas desenháveis, principalmente porque a variedade de configurações de tela é tão vasta agora. O mais complicado é que o estúdio agora não indica especificamente a pasta 'drawable-nodpi', como tal, na visualização do projeto, apenas mostra uma pasta 'drawable'. Se você não tomar cuidado, quando você solta uma imagem nesta pasta no estúdio, ela ganha '

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.

insira a descrição da imagem aqui

Certifique-se de clicar na pasta nodpi na caixa de diálogo, pois a exibição do projeto não mostra todas as pastas desenháveis ​​separadamente, como costumava ser, para que não fique imediatamente claro que foi uma errada. O Studio recriou a baunilha 'drawable' em algum momento para mim depois que eu a havia excluído há muito tempo:

insira a descrição da imagem aqui


3

Isso funcionou para mim: basta mover imagens da pasta drawable para drawable-hdpi.


qual a explicação disso? por que essa mudança funciona?
quer

pls explica por que isso funciona ...?
X-preto ...

3

Soluton, tente isso em seu arquivo de manifesto e use a Biblioteca Glide

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

Use esta biblioteca

  compile 'com.github.bumptech.glide:glide:3.7.0'   

Sua codificação feliz de trabalho

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

adicionar isso ao seu manifesto em aplicativos? android: largeHeap = "true"


também tem mais uma solução: altere altura = altura * 0,75 e largura = largura * 0,75.
SAURABH OMER

2

Eu também tive o problema.

Mesmo com a maioria dos outros acima. O problema é causado por uma imagem enorme.

Apenas redimensione algumas imagens e não é necessário alterar nenhum código.


2

Em alguns casos (por exemplo, operações em loop), o coletor de lixo é mais lento que o seu código. Você pode usar um método auxiliar nesta resposta para aguardar o coletor de lixo .


1

Eu sou um novato no desenvolvimento Android, mas espero que minha solução ajude, funcione perfeitamente na minha condição. Estou usando o Imageview e defina seu plano de fundo como "src" porque estou tentando fazer uma animação de quadro. Eu recebi o mesmo erro, mas quando tentei codificar isso funcionou

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();

1

Eu me deparei com esse problema quando não acabei com minha antiga atividade ao passar para uma nova atividade. Eu consertei comfinish();

    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, se alguém usar 100, a resolução original poderá parar os aplicativos por falta de memória.

se 50 ou menos que 100, essa será uma resolução de 50% ou menos que 100, portanto, isso evitará problemas de falta de memória


1

Você precisa alterar o tamanho do objeto no drawable. É muito grande para o Android exibir. Por exemplo, se você estiver configurando uma imagem, tente uma imagem com menos pixels. Funciona para mim. Obrigado. :)


1

Seu aplicativo está travando porque o tamanho da sua imagem (em MB ou KB) é muito grande e, portanto, não está alocando espaço para isso. Portanto, antes de colar sua imagem no drawable, reduza o tamanho.

OU

Você pode adicionar o seguinte na tag do aplicativo em Manifest.xml

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

Depois de adicionar este aplicativo não irá falhar.

  • sempre use imagens de tamanhos menores no aplicativo.
  • Se você adicionar tamanhos grandes de imagens no aplicativo, adicione a sintaxe acima, mas o tamanho do aplicativo aumentará.

1

Meu problema foi resolvido após adicionar

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

no arquivo Build.Gradle


Isso só faz seu aplicativo realmente inchado no uso de memória
OneCricketeer

@ cricket_007 Qual é a consequência disso, se houver?
Sreekanth Karumanaghat 16/10/19

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

Se estiver carregando uma imagem, tente reduzir a qualidade da imagem, que é o segundo parâmetro do Bitmap. Esta foi a solução no meu caso. Anteriormente, era 90, então tentei com 60 (como está no código abaixo agora).

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();

0

Experimente o mais simples. Talvez o seu aplicativo esteja travando porque o tamanho da imagem (em MB) é muito grande e, portanto, não está alocando espaço para isso. Portanto, antes de colar sua imagem no drawable, reduza o tamanho de qualquer software visualizador ou, se você estiver tirando uma imagem da galeria em tempo de execução, antes de salvá-la, comprima seu bitmap. Funcionou para mim. definitivamente para você 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();

Em seguida, na tag Appliaction, adicione largeheapsize = "true


0

Suponho que você queira usar esta imagem como um ícone. Como o Android está dizendo, sua imagem é muito grande. O que você só precisa fazer é dimensionar sua imagem para que o Android saiba qual tamanho da imagem usar e quando de acordo com a resolução da tela. Para fazer isso, no Android Studio: 1. clique com o botão direito do mouse na pasta res, 2. selecione Image Asset 3. Select icon Type 4. Dê um nome ao ícone 5. Select Image on Asset Type 6. Apare sua imagem Clique em Avançar e termine . No seu código-fonte ou xml, consulte a imagem que agora estará localizada na pasta layout ou mipmap, de acordo com o tipo de ativo selecionado. O erro desaparecerá.


0

Eu realmente não recomendo editar manifestos como este

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

Essas opções causam um efeito de animação não suave no seu aplicativo. Além disso, 'liveData' ou alterando seu banco de dados local (Sqlite, Room) são ativados lentamente. É ruim para a experiência do usuário.

Então, eu recomendo o RESIZE bitmap

Abaixo está o código de exemplo

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

Se android: largeHeap = "true" não funcionou para você,

1:

Compactação de imagem. Estou usando este site

2:

Converta imagens para mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Estou usando este webiste

Não remova android: largeHeap = "true"!


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.