Android: java.lang.OutOfMemoryError: impossibile allocare un'allocazione di 23970828 byte con 2097152 byte liberi e 2 MB fino a OOM


355

Voglio mostrare l' immagine Bitmap in ImageView dalla scheda SD che è già memorizzata. Dopo l'esecuzione la mia applicazione si arresta in modo anomalo e viene visualizzato l' errore OutOfMemoryError di:

(java.lang.OutOfMemoryError: impossibile allocare un'allocazione di 23970828 byte con 2097152 byte liberi e 2 MB fino a OOM)

Non ho idea del perché sia ​​fuori memoria. Penso che la mia dimensione dell'immagine sia molto grande, quindi ho provato a 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);

Le informazioni del gatto di 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)

4
controlla i pixel dell'immagine, la larghezza non deve superare 1440 e l'altezza 2560, facendo questo non mostrerà OutOfMemoryError
Pankaj Lilan

1
@PankajLilan Dove hai trovato questi valori (1440 X 2560)? Qualche riferimento dalle documentazioni Android?
LCJ

Risposte:


525

OutOfMemoryError è il problema più comune che si è verificato in Android mentre si occupava in particolare di bitmap. Questo errore viene generato dalla Java Virtual Machine (JVM) quando un oggetto non può essere allocato a causa della mancanza di spazio di memoria e, inoltre, il Garbage Collector non può liberare spazio.

Come accennato da Aleksey, puoi aggiungere le seguenti entità nel tuo file manifest android:hardwareAccelerated="false", android:largeHeap="true"funzionerà per alcuni ambienti.

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

dovresti assolutamente leggere alcuni dei concetti di Androids Developer, specialmente qui: Visualizzazione efficiente di bitmap

Leggi tutti e 5 gli argomenti e riscrivi nuovamente il codice. Se il problema persiste, saremo felici di vedere cosa hai fatto di sbagliato nel materiale tutorial.

Ecco alcune delle possibili risposte per questo tipo di errori in SOF

Android: BitmapFactory.decodeStream () memoria insufficiente con un file di 400 KB con heap gratuito da 2 MB

Come risolvere il problema java.lang.OutOfMemoryError in Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Soluzione per OutOfMemoryError: la dimensione della bitmap supera il budget della VM

Modifica: dai commenti di @cjnash

Per tutti coloro che hanno avuto ancora degli arresti anomali dopo aver aggiunto questa riga, prova a inserire l'immagine nella cartella res / drawable-xhdpi / anziché in res / drawable / e potrebbe risolvere il problema.


1
Potresti pubblicare come hai risolto il problema? Perché ho lo stesso problema ... In realtà puoi aggiungere nel tuo manifest questa riga android: hardwareAccelerated = "false", android: largeHeap = "true" funziona in alcune situazioni, ma tieni presente che un'altra parte del codice può discutere con questo ...
Aleksey Timoshchenko,

6
la navigazione delle app sta diventando molto lenta dopo aver aggiunto questo.
Uma Achanta,

10
android: hardwareAccelerated = "false" che blocca la tua app
Rahim Rahimov

1
Per tutti coloro che hanno avuto ancora degli arresti anomali dopo aver aggiunto questa riga, prova a inserire l'immagine nella cartella res / drawable-xhdpi / anziché in res / drawable / e potrebbe risolvere il problema.
cjnash,

6
perché consiglieresti android: hardwareAccelerated = "false? qual è il vantaggio di esso?
batmaci

86

hai provato ad aggiungere questo al tuo manifest sotto applicazioni? android:largeHeap="true"?

come questo

  <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
Ho provato con questo android: largeHeap = "true" ma ottenendo lo stesso errore
androidTag

1
prova a comprimere la tua immagine prima di poter usare questo link per farlo tinyjpg.com
TSG

1
puoi anche comprimere png con questo sito
TSG

27

Per me, il problema era che il mio file .png veniva de-compresso per essere una bitmap davvero enorme in memoria, perché l'immagine aveva dimensioni molto grandi (anche se le dimensioni del file erano minuscole).

Quindi la soluzione era semplicemente ridimensionare l'immagine :)


4
questa è la soluzione corretta, perché ho provato prima le soluzioni precedenti, ma dopo l'applicazione android:hardwareAccelerated="false", alcune animazioni come il layout shadow non funzionavano. Ma dopo aver ridimensionato tutti i problemi sono stati risolti, grazie! +1 per questo suggerimento!
Kaushal28,

1
questo risolto il mio problema. Grazie @petrus
Hùng Nguyễn,

27

In realtà puoi aggiungere nel tuo manifest queste righe android:hardwareAccelerated="false", android:largeHeap="true"funziona per alcune situazioni, ma tieni presente che l'altra parte del codice può discutere con questo.

<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
non ha funzionato, si è arrestato in modo anomalo con lo stesso errore, quando utilizzato Bitmap.createBitmap
Narendra Singh

@King sorry (ho anche trascorso un po 'di tempo per risolvere questo problema, ed è un lavoro per me. Ma è solo uno dei modi ... Ci sono molti approcci diversi
Aleksey Timoshchenko,

2
Qual è lo scopo di android: hardwareAccelerated = "false" ?
IgorGanapolsky,

@IgorGanapolsky Dal documento ufficiale dice .. vedi questo link
Shylendra Madda,

27

Questo dovrebbe funzionare

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

Ridimensiona l'immagine prima di configurarla su ImageView in questo modo:

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

dove size è la dimensione effettiva di ImageView. Puoi raggiungere le dimensioni misurando:

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

e usa la misura successiva imageView.getMeasuredWidth()e imageView.getMeasuredHeight()per scaling.


Ho provato con questo Android: largeHeap = "true" ma ottenendo lo stesso errore
androidTag

Un ulteriore esempio del perché ciò non funzionerà necessariamente (utilizzando l'archiviazione privata dell'app): posizionare una bitmap in res / drawable / può dare lo stesso errore ma non accadrà ogni volta. Inserendo la stessa bitmap in res / drawable-xhdpi / non si verificherà più l'errore. Quindi, come risposta, non è corretto da solo.
CmosBattery,

8

Usa la libreria Glide e sostituisci le dimensioni per ridurne le dimensioni;

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

6

Ho seguito l'errore

"E / art: Throwing OutOfMemoryError" Impossibile allocare un'allocazione di 47251468 byte con 16777120 byte liberi e 23 MB fino a OOM "

dopo l'aggiunta android:largeHeap="true"in AndroidManifest.xml poi liberarsi di tutti gli errori

<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: impossibile allocare un'allocazione di 37748748 byte con 16777120 byte liberi e 17 MB fino a OOM

Soluzione: 1.Aprire il file manifest 2. All'interno del tag dell'applicazione, aggiungere appena sotto due righe

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

Esempio :

 <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

Ho risolto questo problema ridimensionando l'immagine a dimensioni inferiori. Sto usando il modulo Xamarin. la riduzione della dimensione dell'immagine PNG ha risolto il problema.


4

Ho scoperto che le immagini nella cartella "disegnabile" verranno convertite in un'immagine molto più grande su telefoni ad alta definizione. Ad esempio, un'immagine da 200k verrà ricampionata a una risoluzione più elevata, ad esempio 800k o 32000k. Ho dovuto scoprirlo da solo e ad oggi non ho visto la documentazione per questa trappola di memoria heap. Per evitare ciò, metto tutto in una cartella drawable-nodpi (oltre a usare 'opzioni' in BitmapFactory in base al particolare heap del dispositivo). Non posso permettermi di gonfiare le dimensioni della mia app con più cartelle disegnabili, soprattutto perché la gamma di valori di schermo è così vasta ora. La cosa difficile è che studio ora non indica specificamente la cartella 'drawable-nodpi' come tale nella vista del progetto, ma mostra semplicemente una cartella 'drawable'. Se non stai attento, quando rilasci un'immagine in questa cartella in studio, ha vinto "

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.

inserisci qui la descrizione dell'immagine

Assicurati di fare clic sulla cartella nodpi nella finestra di dialogo, poiché la vista del progetto non mostrerà tutte le cartelle disegnabili separatamente come una volta, quindi non sarà immediatamente evidente che è andato in una cartella sbagliata. Studio ha ricreato il "disegno" alla vaniglia a un certo punto per me dopo averlo eliminato molto tempo fa:

inserisci qui la descrizione dell'immagine


3

Questo ha funzionato per me: basta spostare le immagini dalla cartella drawable a drawable-hdpi.


qual è la spiegazione di questo? perché questo trasloco funziona?
Harun,

per favore spiega perché questo funziona ...?
X-Black ...

3

Soluton prova questo nel tuo file manifest e usa Glide Library

compilare '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 questa libreria

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

Funziona con la programmazione felice

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

aggiungere questo al manifest in applicazioni? Android: largeHeap = "true"


hanno anche un'altra soluzione: cambia altezza = altezza * .75 e larghezza = larghezza * .75.
SAURABH OMER,

2

Ho avuto anche il problema.

Lo stesso con la maggior parte degli altri sopra. Il problema è causato da un'immagine enorme.

Basta ridimensionare alcune immagini e non è necessario modificare alcun codice.



1

Sono un principiante nello sviluppo di Android, ma spero che la mia soluzione mi aiuti, funziona perfettamente nelle mie condizioni. Sto usando Imageview e ho impostato lo sfondo su "src" perché sto cercando di creare un'animazione di fotogrammi. Ho avuto lo stesso errore ma quando ho provato a scrivere questo ha funzionato

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

1

Mi sono imbattuto in questo problema quando non ho ucciso la mia vecchia attività mentre passavo a una nuova attività. L'ho risolto 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 se si utilizza 100, la risoluzione originale può interrompere l'app per esaurire la memoria.

se 50 o meno di 100 questo sarà il 50% o meno di 100 di risoluzione in modo da evitare problemi di memoria insufficiente


1

Devi modificare la dimensione dell'oggetto in un disegno. È troppo grande per essere visualizzato da Android. ad esempio, se si sta impostando un'immagine, provare l'immagine con meno pixel. Per me funziona. Grazie. :)


1

L'app si arresta in modo anomalo perché la dimensione dell'immagine (in MB o KB) è troppo grande quindi non sta allocando spazio per quello. Quindi, prima di incollare l'immagine in un disegno, è sufficiente ridurne le dimensioni.

O

È possibile aggiungere seguenti nel tag dell'applicazione in Manifest.xml

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

Dopo aver aggiunto questa app non si bloccherà.

  • usa sempre immagini di dimensioni inferiori nell'app.
  • Se aggiungi grandi dimensioni di immagini nell'app, dovresti aggiungere la sintassi sopra, ma le dimensioni dell'app aumenteranno.

1

Il mio problema è stato risolto dopo l'aggiunta

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

nel file Build.Gradle


Questo rende la tua app davvero gonfia nell'uso della memoria
OneCricketeer,

@ cricket_007 Qual è la conseguenza di ciò?
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

Se si carica un'immagine, provare a ridurre la qualità dell'immagine, che è il secondo parametro di Bitmap. Questa era la soluzione nel mio caso. In precedenza era 90, quindi ho provato con 60 (come è ora nel codice qui sotto).

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

0

Prova il più semplice. Forse la tua app si arresta in modo anomalo perché la dimensione dell'immagine (in MB) è troppo grande, quindi non sta allocando spazio per quello. Quindi, prima di incollare l'immagine in un disegno, è sufficiente ridurne le dimensioni con qualsiasi software visualizzatore o se si sta riprendendo un'immagine dalla galleria in fase di esecuzione rispetto a prima di salvarla, comprimere la bitmap. Ha funzionato per me. sicuramente per te lo sarai.


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

Quindi nel tag Appliaction, aggiungi largeheapsize = "true


0

Suppongo che tu voglia usare questa immagine come icona. Come ti dice Android, la tua immagine è troppo grande. Quello che devi solo fare è ridimensionare l'immagine in modo che Android sappia quale dimensione dell'immagine usare e quando in base alla risoluzione dello schermo. A tale scopo, in Android Studio: 1. fare clic con il pulsante destro del mouse sulla cartella res, 2. selezionare Asset immagine 3. Selezionare icona Tipo 4. Assegnare all'icona un nome 5. Selezionare Immagine su Tipo di risorsa 6. Taglia l'immagine Fare clic su Avanti e finire . Nel tuo codice XML o sorgente fai semplicemente riferimento all'immagine che ora si troverà nella cartella layout o mipmap in base al tipo di risorsa selezionata. L'errore sparirà.


0

Non raccomando davvero di modificare manifest in questo modo

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

Queste opzioni causano un effetto di animazione non uniforme sulla tua app. Inoltre 'liveData' o modificando il tuo DB locale (Sqlite, Room) si attivano lentamente. È negativo per l'esperienza dell'utente.

Quindi raccomando RESIZE bitmap

Di seguito è riportato il codice di esempio

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" non ha funzionato per te allora

1:

Compressione dell'immagine. Sto usando questo sito web

2:

Converti immagini in mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Sto usando questo webiste

Non rimuovere android: largeHeap = "true"!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.