Android: java.lang.OutOfMemoryError: Fehler beim Zuweisen einer 23970828-Byte-Zuordnung mit 2097152 freien Bytes und 2 MB bis OOM


355

Ich möchte das Bitmap- Bild in ImageView von einer SD- Karte anzeigen , die bereits gespeichert ist. Nach dem Ausführen stürzt meine Anwendung ab und es wird der OutOfMemoryError- Fehler angezeigt :

(java.lang.OutOfMemoryError: Fehler beim Zuweisen einer 23970828-Byte-Zuordnung mit 2097152 freien Bytes und 2 MB bis OOM)

Ich habe keine Ahnung oder warum es nicht mehr im Gedächtnis ist. Ich denke, meine Bildgröße ist sehr groß, deshalb habe ich versucht, sie zu ändern.

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

Die Log-Cat-Informationen:

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
Überprüfen Sie die Pixel des Bildes, die Breite darf 1440 und die Höhe 2560 nicht überschreiten. Auf diese Weise wird OutOfMemoryError
Pankaj Lilan

1
@PankajLilan Wo haben Sie diese Werte gefunden (1440 x 2560)? Irgendwelche Referenzen aus Android-Dokumentationen?
LCJ

Antworten:


525

OutOfMemoryError ist das häufigste Problem bei Android, insbesondere beim Umgang mit Bitmaps. Dieser Fehler wird von der Java Virtual Machine (JVM) ausgelöst, wenn ein Objekt aufgrund fehlenden Speicherplatzes nicht zugewiesen werden kann und der Garbage Collector keinen Speicherplatz freigeben kann.

Wie von Aleksey erwähnt, können Sie unter Entitäten in Ihrer Manifest - Datei hinzufügen android:hardwareAccelerated="false", android:largeHeap="true"wird es für einige Umgebung arbeiten.

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

Sie sollten auf jeden Fall einige der Androids Developer-Konzepte lesen, insbesondere hier: Effizientes Anzeigen von Bitmaps

Lesen Sie alle 5 Themen und schreiben Sie Ihren Code erneut. Wenn es immer noch nicht funktioniert, werden wir uns freuen zu sehen, was Sie mit dem Tutorial-Material falsch gemacht haben.

Hier einige mögliche Antworten für diese Art von Fehlern in SOF

Android: BitmapFactory.decodeStream () nicht genügend Speicher mit einer 400-KB-Datei mit 2 MB freiem Heap

So lösen Sie Probleme mit java.lang.OutOfMemoryError in Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Lösung für OutOfMemoryError: Die Bitmap-Größe überschreitet das VM-Budget

Bearbeiten: Aus den Kommentaren von @cjnash

Versuchen Sie für alle, die nach dem Hinzufügen dieser Zeile noch Abstürze hatten, Ihr Bild in Ihren Ordner res / drawable-xhdpi / anstatt in Ihren Ordner res / drawable / zu stecken, um das Problem zu beheben.


1
Könnten Sie bitte posten, wie Sie das Problem letztendlich gelöst haben? Weil ich das gleiche Problem habe ... Eigentlich können Sie in Ihrem Manifest diese Zeilen android: hardwareAccelerated = "false", android: largeHeap = "true" hinzufügen, es funktioniert in einigen Situationen, aber beachten Sie, dass ein anderer Teil des Codes kann streiten mit diesem ...
Aleksey Timoshchenko

6
Die App-Navigation wird nach dem Hinzufügen sehr langsam.
Uma Achanta

10
android: hardwareAccelerated = "false" Einfrieren Ihrer App
Rahim Rahimov

1
Versuchen Sie für alle, die nach dem Hinzufügen dieser Zeile noch Abstürze hatten, Ihr Bild in Ihren Ordner res / drawable-xhdpi / anstatt in Ihren Ordner res / drawable / zu stecken, um das Problem zu beheben.
cjnash

6
warum würden Sie android vorschlagen: hardwareAccelerated = "false? Was ist der Vorteil davon?
Batmaci

86

Haben Sie versucht, dies Ihrem Manifest unter Anwendungen hinzuzufügen? android:largeHeap="true"?

so was

  <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
Ich habe es mit diesem Android versucht: largeHeap = "true", aber den gleichen Fehler erhalten
androidTag

1
Versuchen Sie, Ihr Bild zu komprimieren, bevor Sie diesen Link verwenden können. tinyjpg.com
TSG

1
Sie können PNG auch mit dieser Seite komprimieren
TSG

27

Für mich war das Problem, dass meine .png-Datei dekomprimiert wurde, um eine wirklich große Bitmap im Speicher zu sein, da das Bild sehr große Abmessungen hatte (obwohl die Dateigröße winzig war).

Die Lösung bestand also darin, die Größe des Bildes einfach zu ändern :)


3
Dies ist die richtige Lösung, da ich zuerst die oben genannten Lösungen ausprobiert habe, aber nach dem Anwenden android:hardwareAccelerated="false"funktionierten einige Animationen wie Layoutschatten nicht. Aber nach der Größenänderung wurden alle Probleme gelöst, danke! +1 für diesen Hinweis!
Kaushal28

1
Dies hat mein Problem behoben. Vielen Dank, dass Sie @petrus
Hùng Nguyễn

27

Eigentlich können Sie in Ihrem Manifest diese Zeilen hinzufügen android:hardwareAccelerated="false", android:largeHeap="true"es funktioniert in einigen Situationen, aber beachten Sie, dass der andere Teil des Codes damit streiten kann.

<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
hat nicht funktioniert, es stürzte mit dem gleichen Fehler ab, wenn Bitmap.createBitmap
Narendra Singh

@King sorry (ich habe auch einige Zeit damit verbracht, dieses Problem zu lösen, und es ist Arbeit für mich. Aber es ist nur einer der Wege ... Es gibt viele verschiedene Ansätze
Aleksey Timoshchenko

2
Was ist der Zweck von Android: HardwareAccelerated = "false" ?
IgorGanapolsky

@IgorGanapolsky Von offiziellen doc sagt .. siehe diesen Link
Shylendra Madda

27

Das sollte funktionieren

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

Ändern Sie die Größe Ihres Bildes vor dem Einrichten in ImageView wie folgt:

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

Dabei ist Größe die tatsächliche Größe von ImageView. Sie können die Größe erreichen, indem Sie messen:

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

und verwenden Sie die nächste Größe imageView.getMeasuredWidth()und imageView.getMeasuredHeight()für scaling.


Ich habe mit diesem Android versucht: largeHeap = "true", aber den gleichen Fehler erhalten
androidTag

Ein weiteres Beispiel dafür, warum dies nicht unbedingt funktioniert (unter Verwendung des privaten App-Speichers): Das Platzieren einer Bitmap in res / drawable / kann denselben Fehler verursachen, tritt jedoch nicht jedes Mal auf. Wenn Sie dieselbe Bitmap in res / drawable-xhdpi / einfügen, tritt der Fehler nicht mehr auf. Als Antwort ist es an sich nicht korrekt.
CmosBattery

8

Verwenden Sie die Gleitbibliothek und überschreiben Sie die Größe, um die Größe zu verringern.

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

6

Ich habe unten Fehler

"E / art: Throwing OutOfMemoryError" Fehler beim Zuweisen einer 47251468-Byte-Zuordnung mit 16777120 freien Bytes und 23 MB bis OOM "

Nach dem Hinzufügen android:largeHeap="true"in AndroidManifest.xml entferne ich alle Fehler

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

4

Ich habe dieses Problem behoben, indem ich die Größe des Bildes auf eine geringere Größe geändert habe. Ich benutze Xamarin Form. Durch Verringern der Größe des PNG-Bildes wurde das Problem behoben.


4

Problem: Fehler beim Zuweisen einer 37748748-Byte-Zuordnung mit 16777120 freien Bytes und 17 MB bis OOM

Lösung: 1. Öffnen Sie Ihre Manifestdatei. 2. Fügen Sie innerhalb des Anwendungs-Tags nur zwei Zeilen hinzu

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

Beispiel:

 <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

Ich habe festgestellt, dass Bilder im Ordner "Zeichenbar" auf HD-Telefonen in ein viel größeres Bild konvertiert werden. Beispielsweise wird ein 200k-Bild auf eine höhere Auflösung wie 800k oder 32000k neu abgetastet. Ich musste dies selbst herausfinden und habe bisher keine Dokumentation für diese Heap-Speicherfalle gesehen. Um dies zu verhindern, habe ich alles in einen Drawable-Nodpi-Ordner gelegt (zusätzlich zur Verwendung von 'Optionen' in BitmapFactory basierend auf dem jeweiligen Geräte-Heap). Ich kann es mir nicht leisten, die Größe meiner App mit mehreren Zeichenordnern aufzublähen, zumal die Auswahl an Bildschirmdefiziten jetzt so groß ist. Das Knifflige ist, dass Studio jetzt nicht speziell den Ordner 'drawable-nodpi' als solchen in der Projektansicht anzeigt, sondern nur einen Ordner 'drawable'. Wenn Sie nicht aufpassen, wenn Sie ein Bild in diesem Ordner im Studio ablegen, hat es gewonnen. '

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.

Geben Sie hier die Bildbeschreibung ein

Stellen Sie sicher, dass Sie im Dialogfeld auf den Nodpi-Ordner klicken, da in der Projektansicht nicht wie früher alle Zeichenordner separat angezeigt werden, sodass nicht sofort ersichtlich ist, dass der Ordner falsch ist. Studio hat die Vanille irgendwann für mich neu erstellt, nachdem ich sie vor langer Zeit gelöscht hatte:

Geben Sie hier die Bildbeschreibung ein


3

Das hat bei mir funktioniert: Verschieben Sie einfach Bilder aus dem Zeichenordner nach drawable-hdpi.


Was ist die Erklärung dafür? Warum funktioniert dieser Umzug?
Harun

Bitte erklären Sie, warum dies funktioniert ...?
X-Black ...

3

Soluton versuchen Sie dies in Ihrer Manifest-Datei und verwenden Sie die Glide-Bibliothek

kompiliere '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 = "wahr"

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

Verwenden Sie diese Bibliothek

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

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

3

Fügen Sie dies Ihrem Manifest unter Anwendungen hinzu? android: largeHeap = "wahr"


Sie haben auch noch eine Lösung: Ändern Sie Höhe = Höhe * .75 und Breite = Breite * .75.
SAURABH OMER

2

Ich hatte auch das Problem.

Gleiches gilt für die meisten anderen oben. Das Problem wird durch ein großes Bild verursacht.

Ändern Sie einfach die Größe einiger Bilder und Sie müssen keinen Code ändern.



1

Ich bin ein Neuling in der Android-Entwicklung, aber ich hoffe, meine Lösung hilft, es funktioniert perfekt unter meinem Zustand. Ich benutze Imageview und setze den Hintergrund auf "src", weil ich versuche, eine Rahmenanimation zu erstellen. Ich habe den gleichen Fehler erhalten, aber als ich versuchte, dies zu codieren, funktionierte es

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

1

Ich bin auf dieses Problem gestoßen, als ich meine alte Aktivität nicht beendet habe, als ich zu einer neuen Aktivität übergegangen bin. Ich habe es mit behobenfinish();

    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 Wenn man 100 verwendet, kann die ursprüngliche Auflösung die Apps für nicht genügend Speicher stoppen.

Wenn 50 oder weniger als 100, entspricht dies einer Auflösung von 50% oder weniger als 100, um ein Problem mit zu wenig Speicher zu vermeiden


1

Sie müssen die Größe des Objekts in Drawable ändern. Es ist zu groß für Android, um es anzuzeigen. Beispiel: Wenn Sie ein Bild einstellen, versuchen Sie es mit einem Bild mit weniger Pixeln. Für mich geht das. Vielen Dank. :) :)


1

Ihre App stürzt ab, weil Ihre Bildgröße (in MB oder KB) zu groß ist, sodass kein Speicherplatz dafür zugewiesen wird. Reduzieren Sie also die Größe, bevor Sie Ihr Bild in Drawable einfügen.

ODER

Sie können Folgendes im Anwendungstag unter Manifest.xml hinzufügen

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

Nach dem Hinzufügen dieser App stürzt nicht ab.

  • Verwenden Sie in der App immer Bilder mit geringerer Größe.
  • Wenn Sie große Bilder in der App hinzufügen, sollten Sie oben Syntex hinzufügen, aber die App-Größe nimmt zu.

1

Mein Problem wurde nach dem Hinzufügen gelöst

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

in der Build.Gradle-Datei


Dies macht Ihre App nur in der Speichernutzung wirklich aufgebläht
OneCricketeer

@ Cricket_007 Was ist die Folge davon, wenn überhaupt?
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

Versuchen Sie beim Hochladen eines Bildes, die Bildqualität zu verringern. Dies ist der zweite Parameter der Bitmap. Dies war die Lösung in meinem Fall. Früher war es 90, dann habe ich es mit 60 versucht (wie es jetzt im Code unten steht).

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

0

Versuchen Sie es mit dem einfachsten. Möglicherweise stürzt Ihre App ab, weil Ihre Bildgröße (in MB) zu groß ist, sodass kein Speicherplatz dafür zugewiesen wird. Bevor Sie Ihr Bild in Drawable einfügen, reduzieren Sie die Größe mit einer beliebigen Viewer-Software oder wenn Sie zur Laufzeit Bilder aus der Galerie aufnehmen, komprimieren Sie Ihre Bitmap vor dem Speichern. Es hat bei mir funktioniert. auf jeden Fall für dich sein.


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

Fügen Sie dann im Appliaction-Tag largeheapsize = "true" hinzu


0

Ich nehme an, Sie möchten dieses Bild als Symbol verwenden. Wie Android Ihnen sagt, ist Ihr Bild zu groß. Sie müssen lediglich Ihr Bild skalieren, damit Android weiß, welche Größe des Bildes wann verwendet werden soll, je nach Bildschirmauflösung. Um dies zu erreichen, gehen Sie in Android Studio wie folgt vor: 1. Klicken Sie mit der rechten Maustaste auf den Ordner res, 2. wählen Sie Image Asset aus. 3. Wählen Sie den Symboltyp aus. 4. Geben Sie dem Symbol einen Namen. 5. Wählen Sie Image on Asset Type aus. 6. Schneiden Sie Ihr Bild. Klicken Sie auf Weiter und beenden Sie den Vorgang . Beziehen Sie sich in Ihrem XML- oder Quellcode einfach auf das Bild, das sich je nach ausgewähltem Asset-Typ entweder im Layout- oder im Mipmap-Ordner befindet. Der Fehler wird behoben.


0

Ich empfehle nicht wirklich, das Manifest so zu bearbeiten

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

Diese Optionen verursachen keinen reibungslosen Animationseffekt in Ihrer App. Außerdem wird 'liveData' oder das Ändern Ihrer lokalen Datenbank (Sqlite, Room) langsam aktiviert. Es ist schlecht für die Benutzererfahrung.

Daher empfehle ich RESIZE Bitmap

Unten ist der Beispielcode

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

Wenn android: largeHeap = "true" dann bei Ihnen nicht funktioniert hat

1:

Bildkompression. Ich benutze diese Website

2:

Konvertieren Sie Bilder in mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Ich benutze diese Website

Android nicht entfernen: largeHeap = "true"!


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.