Android: java.lang.OutOfMemoryError: impossible d'allouer une allocation d'octets 23970828 avec 2097152 octets libres et 2 Mo jusqu'à MOO

355

Je veux montrer l' image Bitmap dans ImageView de la carte SD qui est déjà stockée. Après l'exécution, mon application se bloque et obtient l' erreur OutOfMemoryError de:

(java.lang.OutOfMemoryError: échec de l'allocation d'une allocation d'octets 23970828 avec 2097152 octets libres et 2 Mo jusqu'à MOO)

Je n'ai aucune idée ni pourquoi sa mémoire est insuffisante. Je pense que ma taille d'image est très grande, j'ai donc essayé de la changer.

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

Les informations de chat de journal:

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)
androidTag
la source
4
vérifiez les pixels de l'image, la largeur ne doit pas dépasser 1440 et la hauteur 2560, en faisant cela, elle ne montrera pas OutOfMemoryError
Pankaj Lilan
1
@PankajLilan Où avez-vous trouvé ces valeurs (1440 X 2560)? Des références de documentations Android?
LCJ

Réponses:

525

OutOfMemoryError est le problème le plus courant survenu dans Android, en particulier avec les bitmaps. Cette erreur est levée par la machine virtuelle Java (JVM) lorsqu'un objet ne peut pas être alloué en raison d'un manque d'espace mémoire et également, le garbage collector ne peut pas libérer de l'espace.

Comme mentionné par Aleksey, vous pouvez ajouter des entités ci-dessous dans votre fichier manifeste android:hardwareAccelerated="false", android:largeHeap="true"cela fonctionnera pour certains environnements.

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

vous devriez certainement lire certains des concepts du développeur Androids, spécialement ici: Affichage efficace des bitmaps

Lisez les 5 rubriques et réécrivez votre code à nouveau. Si cela ne fonctionne toujours pas, nous serons heureux de voir ce que vous avez fait de mal avec le matériel didactique.

Voici quelques réponses possibles pour ce type d'erreurs dans SOF

Android: BitmapFactory.decodeStream () manque de mémoire avec un fichier de 400 Ko avec 2 Mo de mémoire libre

Comment résoudre les problèmes java.lang.OutOfMemoryError dans Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Solution pour OutOfMemoryError: la taille du bitmap dépasse le budget de la machine virtuelle

Edit: D'après les commentaires de @cjnash

Si vous avez encore des plantages après avoir ajouté cette ligne, essayez de coller votre image dans votre dossier res / drawable-xhdpi / au lieu de votre res / drawable / et cela pourrait résoudre votre problème.

Roi des masses
la source
1
Pourriez-vous s'il vous plaît poster comment vous avez finalement résolu le problème? Parce que j'ai le même problème ... En fait, vous pouvez ajouter dans votre manifeste ces lignes android: hardwareAccelerated = "false", android: largeHeap = "true" cela fonctionne pour certaines situations, mais sachez qu'une autre partie du code peut discuter avec cela ...
Aleksey Timoshchenko
6
la navigation dans les applications devient très lente après avoir ajouté cela.
Uma Achanta
10
android: hardwareAccelerated = "false" gelant votre application
Rahim Rahimov
1
Si vous avez encore des plantages après avoir ajouté cette ligne, essayez de coller votre image dans votre dossier res / drawable-xhdpi / au lieu de votre res / drawable / et cela pourrait résoudre votre problème.
cjnash
6
pourquoi suggéreriez-vous android: hardwareAccelerated = "false? quel en est l'avantage?
batmaci
86

avez-vous essayé d'ajouter ceci à votre manifeste sous applications? android:largeHeap="true"?

comme ça

  <application
      android:name=".ParaseApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:largeHeap="true" >
TSG
la source
17
J'ai essayé avec cet androïde: largeHeap = "true" mais
j'obtiens la
1
essayez de compresser votre image avant de pouvoir utiliser ce lien pour le faire tinyjpg.com
TSG
1
vous pouvez également compresser png avec ce site
TSG
27

Pour moi, le problème était que mon fichier .png était décompressé pour être un très gros bitmap en mémoire, car l'image avait de très grandes dimensions (même si la taille du fichier était minuscule).

Le correctif a donc été de simplement redimensionner l'image :)

petrus-jvrensburg
la source
4
c'est la bonne solution, car j'ai d'abord essayé les solutions ci-dessus, mais après application android:hardwareAccelerated="false", certaines animations comme l'ombre de la mise en page ne fonctionnaient pas. Mais après avoir redimensionné tous les problèmes ont été résolus merci! +1 pour cet indice!
Kaushal28
1
cela a résolu mon problème. Merci @petrus
Hùng Nguyễn
27

En fait, vous pouvez ajouter dans votre manifeste ces lignes android:hardwareAccelerated="false", android:largeHeap="true"cela fonctionne pour certaines situations, mais sachez que l'autre partie du code peut être en désaccord avec cela.

<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">
Aleksey Timoshchenko
la source
2
n'a pas fonctionné, il s'est écrasé avec la même erreur, lorsqu'il est utilisé Bitmap.createBitmap
Narendra Singh
@ King désolé (j'ai aussi passé un peu de temps pour résoudre ce problème, et cela fonctionne pour moi. Mais ce n'est qu'un des moyens ... Il y a beaucoup d'approche différente
Aleksey Timoshchenko
2
Quel est le but d' Android: hardwareAccelerated = "false" ?
IgorGanapolsky
@IgorGanapolsky Du doc ​​officiel dit .. voir ce lien
Shylendra Madda
27

Cela devrait fonctionner

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
Akshay komarla
la source
11

Redimensionnez votre image avant de configurer ImageView comme ceci:

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

où taille est la taille réelle d'ImageView. Vous pouvez atteindre la taille en mesurant:

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

et utilisez la taille suivante imageView.getMeasuredWidth()et imageView.getMeasuredHeight()pour scaling.

Vladimir Eremeev
la source
J'ai essayé avec cet androïde: largeHeap = "true" mais obtenant la même erreur
androidTag
Un autre exemple de pourquoi cela ne fonctionnera pas nécessairement (en utilisant le stockage d'applications privées): Placer une image bitmap dans res / drawable / peut donner la même erreur mais cela ne se produira pas à chaque fois. Placer le même bitmap dans res / drawable-xhdpi / n'aura plus l'erreur. Donc, comme réponse, ce n'est pas correct en soi.
CmosBattery
8

Utilisez Glide Library et Override size pour réduire la taille;

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);
Mahdi Azadbar
la source
6

Je suis en dessous de l'erreur

"E / art: Throwing OutOfMemoryError" Impossible d'allouer une allocation de 47251468 octets avec 16777120 octets libres et 23 Mo jusqu'à MOO "

après avoir ajouté android:largeHeap="true"dans AndroidManifest.xml, je me débarrasse de toutes les erreurs

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">
Sai Gopi N
la source
5

Problème: impossible d'allouer une allocation de 37748748 octets avec 16777120 octets libres et 17 Mo jusqu'au MOO

Solution: 1. ouvrez votre fichier manifeste 2. à l'intérieur de la balise d'application, ajoutez simplement ci-dessous deux lignes

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

Exemple :

 <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">
Kishore Reddy
la source
4

J'ai résolu ce problème en redimensionnant l'image à une taille inférieure. J'utilise le formulaire xamarin. la diminution de la taille de l'image PNG a résolu le problème.

maxspan
la source
4

J'ai constaté que les images du dossier «dessinable» seront converties en une image beaucoup plus grande sur les téléphones haute définition. Par exemple, une image de 200k sera rééchantillonnée à une résolution plus élevée, comme 800k ou 32000k. J'ai dû le découvrir par moi-même et à ce jour, je n'ai pas vu de documentation pour ce piège de mémoire de tas. Pour éviter cela, je mets tout dans un dossier drawpi-nodpi (en plus d'utiliser les «options» dans BitmapFactory en fonction du tas de périphérique particulier). Je ne peux pas me permettre d'avoir la taille de mon application gonflée de plusieurs dossiers à dessiner, d'autant plus que la gamme de paramètres d'écran est si vaste maintenant. La chose délicate est que le studio n'indique pas spécifiquement le dossier 'drawable-nodpi' en tant que tel dans la vue du projet, il montre juste un dossier 'drawable'. Si vous ne faites pas attention, lorsque vous déposez une image dans ce dossier en studio, elle a gagné '

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.

entrez la description de l'image ici

Assurez-vous de cliquer sur le dossier nodpi dans la boîte de dialogue, car la vue du projet ne vous montrera pas tous les dossiers dessinables séparément comme auparavant, il ne sera donc pas immédiatement évident qu'il s'est trompé. Studio a recréé la vanille `` dessinable '' à un moment donné pour moi après l'avoir supprimée il y a longtemps:

entrez la description de l'image ici

Androidcoder
la source
3

Cela a fonctionné pour moi: il suffit de déplacer les images du dossier drawable vers drawable-hdpi.

Hossein Amini
la source
quelle est l'explication de cela? pourquoi ce déménagement fonctionne?
Harun
pls expliquer pourquoi cela fonctionne ...?
X-Black ...
3

Soluton essayez ceci dans votre fichier manifeste et utilisez la bibliothèque Glide

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

Utilisez cette bibliothèque

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

Son travail Happy Coding

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();
    }
}
Keshav Gera
la source
3

l'ajouter à votre manifeste sous applications? android: largeHeap = "true"

SAURABH OMER
la source
ont également une autre solution: changer hauteur = hauteur * .75 et largeur = largeur * .75.
SAURABH OMER
2

J'ai aussi eu le problème.

Même chose avec la plupart des autres ci-dessus. Le problème est dû à une image énorme.

Redimensionnez simplement certaines images et ne modifiez aucun code.

Mike Yan
la source
2

Dans certains cas (par exemple les opérations dans une boucle), le garbage collector est plus lent que votre code. Vous pouvez utiliser une méthode d'assistance à partir de cette réponse pour attendre le garbage collector .

Zon
la source
1

Je suis un débutant dans le développement Android, mais j'espère que ma solution aide, cela fonctionne parfaitement dans mon état. Im utilisant Imageview et définissez son arrière-plan sur "src" parce que j'essaie de faire une animation d'image. J'ai eu la même erreur mais quand j'ai essayé de coder ça, ça a marché

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

J'ai rencontré ce problème lorsque je n'ai pas tué mon ancienne activité en passant à une nouvelle activité. Je l'ai réparé avecfinish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();
Jason Hu
la source
1
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

50/100 si l'on utilise 100, la résolution d'origine peut arrêter les applications pour mémoire insuffisante.

si 50 ou moins de 100, ce sera une résolution de 50% ou moins de 100, donc cela évitera un problème de mémoire insuffisante

RAHINUR RAHMAN
la source
1

Vous devez changer la taille de l'objet en dessinable. Il est trop grand pour être affiché sur Android. Par exemple, si vous définissez une image, essayez une image avec moins de pixels. Ça marche pour moi. Merci. :)

Ali Hassan Qureshi
la source
1

Votre application se bloque car la taille de votre image (en Mo ou en Ko) est trop grande , elle n'alloue donc pas d'espace pour cela. Donc, avant de coller votre image en dessin, réduisez simplement la taille.

OU

Vous pouvez ajouter le suivi dans la balise d'application sur Manifest.xml

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

Après avoir ajouté cette application ne se bloquera pas.

  • utilisez toujours des images de tailles inférieures dans l'application.
  • Si vous ajoutez de grandes tailles d'images dans l'application, vous devez ajouter ci-dessus syntex, mais la taille de l'application augmentera.
rhaldar
la source
1

Mon problème résolu après l'ajout

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

dans le fichier Build.Gradle

Midhilaj
la source
Cela rend votre application vraiment gonflée dans l'utilisation de la mémoire
OneCricketeer
@ cricket_007 Quelle est la conséquence de cela, le cas échéant?
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.....
Ambilpura Sunil Kumar
la source
0

Si vous téléchargez une image, essayez de réduire la qualité de l'image, qui est le deuxième paramètre du bitmap. C'était la solution dans mon cas. Auparavant, c'était 90, puis j'ai essayé avec 60 (comme c'est le cas dans le code ci-dessous maintenant).

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

Essayez le plus simple. Peut-être que votre application se bloque parce que la taille de votre image (en Mo) est trop grande donc elle n'alloue pas d'espace pour cela. Donc, avant de coller votre image dans un dessin, réduisez simplement la taille par n'importe quel logiciel de visualisation ou si vous prenez une image de la galerie au moment de l'exécution, avant de l'enregistrer, compressez votre bitmap. Ça a marché pour moi. certainement pour vous.

neens
la source
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();

Ensuite, dans la balise Appliaction, ajoutez largeheapsize = "true

sathish mobapp dev
la source
0

Je suppose que vous voulez utiliser cette image comme icône. Comme Android vous le dit, votre image est trop grande. Il vous suffit de mettre votre image à l'échelle afin qu'Android sache quelle taille de l'image utiliser et quand en fonction de la résolution de l'écran. Pour cela, dans Android Studio: 1. faites un clic droit sur le dossier res, 2. sélectionnez Image Asset 3. Sélectionnez l'icône Type 4. Donnez un nom à l'icône 5. Sélectionnez Image sur Asset Type 6. Découpez votre image Cliquez sur Next et terminez . Dans votre code XML ou source, il vous suffit de vous référer à l'image qui sera désormais située soit dans la mise en page, soit dans le dossier mipmap selon le type d'actif sélectionné. L'erreur disparaîtra.

Simbarashe Mupfururirwa
la source
0

Je ne recommande pas vraiment d'éditer un manifeste comme celui-ci

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

Ces options provoquent un effet d'animation non fluide sur votre application. De plus, 'liveData' ou la modification de votre base de données locale (Sqlite, Room) s'activent lentement. C'est mauvais pour l'expérience utilisateur.

Je recommande donc de redimensionner le bitmap

Voici l'exemple de code

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)
 }
J.Dragon
la source
0

Si android: largeHeap = "true" ne fonctionnait pas pour vous, alors

1:

Compression d'image. J'utilise ce site Web

2:

Convertissez les images en mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. J'utilise ce site web

Ne supprimez pas android: largeHeap = "true"!

Shahzad Afridi
la source
-1

Utilisez une bibliothèque de chargement d'images comme Picasso ou Glide . L'utilisation de ces bibliothèques empêchera les plantages à l'avenir.

Vladyslav Panchenko
la source