Android: java.lang.OutOfMemoryError: Nie udało się przydzielić alokacji 23970828 bajtów z 2097152 wolnymi bajtami i 2 MB do OOM

355

Chcę pokazać obraz bitmapowy w ImageView z karty SD, która jest już zapisana. Po uruchomieniu moja aplikacja ulega awarii i pojawia się błąd OutOfMemoryError :

(java.lang.OutOfMemoryError: Nie udało się przydzielić alokacji 23970828 bajtów z 2097152 wolnymi bajtami i 2 MB do OOM)

Nie mam pojęcia ani dlaczego brak pamięci. Myślę, że mój rozmiar obrazu jest bardzo duży, więc próbowałem go zmienić.

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

Informacje o kocie dziennika:

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
źródło
4
sprawdź piksele obrazu, szerokość nie może przekraczać 1440, a wysokość
2560. W
1
@PankajLilan Gdzie znalazłeś te wartości (1440 X 2560)? Wszelkie odniesienia z dokumentacji Androida?
LCJ

Odpowiedzi:

525

Błąd brak pamięci to najczęstszy problem występujący w Androidzie, szczególnie w przypadku map bitowych. Ten błąd jest zgłaszany przez maszynę wirtualną Java (JVM), gdy obiekt nie może zostać przydzielony z powodu braku miejsca w pamięci, a także moduł odśmiecania nie może zwolnić miejsca.

Jak wspomniano Aleksey, w pliku manifestu możesz dodać poniższe encje android:hardwareAccelerated="false", android:largeHeap="true"będzie to działać w niektórych środowiskach.

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

zdecydowanie powinieneś przeczytać niektóre koncepcje Deweloperów Androidów, szczególnie tutaj: Wydajne wyświetlanie map bitowych

Przeczytaj wszystkie 5 tematów i przepisz kod ponownie. Jeśli nadal nie działa, z przyjemnością zobaczymy, co zrobiłeś źle z materiałem do samouczka.

Oto niektóre z możliwych odpowiedzi na tego typu błędy w SOF

Android: BitmapFactory.decodeStream () brak pamięci w pliku 400 KB z 2 MB wolnej sterty

Jak rozwiązać problem z java.lang.OutOfMemoryError w Androidzie

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Rozwiązanie dla OutOfMemoryError: rozmiar mapy bitowej przekracza budżet maszyny wirtualnej

Edycja: Na podstawie komentarzy @cjnash

Dla każdego, kto nadal miał awarie po dodaniu tej linii, spróbuj przykleić obraz do folderu res / drawable-xhdpi / zamiast res / drawable / i może to rozwiązać problem.

Król Mszy
źródło
1
Czy mógłbyś napisać, jak ostatecznie rozwiązałeś problem? Ponieważ mam ten sam problem ... Właściwie możesz dodać w swoim manifeście te linie android: hardwareAccelerated = "false", android: largeHeap = "true" to działa w niektórych sytuacjach, ale pamiętaj, że inna część kodu może kłócić się z tym ...
Aleksey Timoshchenko 20.04.16
6
po dodaniu tego nawigacja aplikacji staje się bardzo wolna.
Uma Achanta
10
android: hardwareAccelerated = "false" zamrażanie aplikacji
Rahim Rahimov
1
Dla każdego, kto nadal miał awarie po dodaniu tej linii, spróbuj przykleić obraz do folderu res / drawable-xhdpi / zamiast res / drawable / i może to rozwiązać problem.
cjnash
6
dlaczego sugerowałbyś Androida: hardwareAccelerated = "false? jakie są tego zalety?
batmaci
86

próbowałeś dodać to do manifestu w aplikacjach? android:largeHeap="true"?

lubię to

  <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
źródło
17
Próbowałem z tym Androidem: largeHeap = "true", ale otrzymuję ten sam błąd
androidTag
1
spróbuj skompresować swój obraz, zanim będziesz mógł użyć tego linku, aby to zrobić tinyjpg.com
TSG
1
możesz także skompresować png za pomocą tej strony
TSG
27

Dla mnie problem polegał na tym, że mój plik .png był dekompresowany, aby był naprawdę ogromną bitmapą w pamięci, ponieważ obraz miał bardzo duże wymiary (mimo że rozmiar pliku był niewielki).

Więc poprawka polegała na zmianie rozmiaru obrazu :)

petrus-jvrensburg
źródło
3
jest to prawidłowe rozwiązanie, ponieważ najpierw wypróbowałem powyższe rozwiązania, ale po zastosowaniu android:hardwareAccelerated="false"niektóre animacje, takie jak cień układu, nie działały. Ale po zmianie rozmiaru wszystkie problemy zostały rozwiązane, dziękuję! +1 za tę wskazówkę!
Kaushal
1
to naprawiło mój problem. Dziękuję @petrus
Nguyễn
27

Właściwie możesz dodać w swoim manifeście te wiersze android:hardwareAccelerated="false", android:largeHeap="true"to działa w niektórych sytuacjach, ale pamiętaj, że inna część kodu może się z tym kłócić.

<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">
Aleksiej Tymoszenko
źródło
2
nie działał, rozbił się z tym samym błędem, gdy użyto Bitmap.createBitmap
Narendra Singh
@King przepraszam (poświęciłem również trochę czasu, aby rozwiązać ten problem, i to jest dla mnie praca. Ale to tylko jedna ze sposobów ... Istnieje wiele różnych podejść
Aleksey Timoshchenko
2
Jaki jest cel Androida: hardwareAccelerated = "false" ?
IgorGanapolsky
@IgorGanapolsky Z oficjalnego dokumentu mówi .. zobacz ten link
Shylendra Madda
27

To powinno działać

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
Akshay komarla
źródło
11

Zmień rozmiar obrazu przed konfiguracją do ImageView w następujący sposób:

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

gdzie rozmiar to rzeczywisty rozmiar ImageView. Możesz osiągnąć rozmiar mierząc:

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

i użyj następnego rozmiaru imageView.getMeasuredWidth()i imageView.getMeasuredHeight()dla scaling.

Vladimir Eremeev
źródło
Próbowałem z tym Androidem: largeHeap = "true", ale otrzymuję ten sam błąd
androidTag
Kolejny przykład, dlaczego niekoniecznie to zadziała (przy użyciu prywatnego przechowywania aplikacji): Umieszczenie bitmapy w res / drawable / może dać ten sam błąd, ale nie zdarzy się to za każdym razem. Umieszczenie tej samej mapy bitowej w res / drawable-xhdpi / nie będzie już powodować błędu. Jako odpowiedź sama w sobie nie jest poprawna.
CmosBattery
8

Użyj Glide Library i Override size, aby zmniejszyć rozmiar;

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);
Mahdi Azadbar
źródło
6

Mam błąd poniżej

„E / art: Throwing OutOfMemoryError” Nie udało się przydzielić alokacji 47251468 bajtów z 16777120 wolnymi bajtami i 23 MB do OOM ”

po dodaniu android:largeHeap="true"w AndroidManifest.xml pozbywam się wszystkich błędów

<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.
źródło
4

Rozwiązałem ten problem, zmieniając rozmiar obrazu do mniejszego rozmiaru. Używam formularza Xamarin. zmniejszenie rozmiaru obrazu PNG rozwiązało problem.

maxspan
źródło
4

Problem: nie udało się przydzielić 37748748 bajtów przy 16777120 wolnych bajtach i 17 MB do OOM

Rozwiązanie: 1. otwórz plik manifestu 2. wewnątrz tagu aplikacji po prostu dodaj poniżej dwóch wierszy

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

Przykład:

 <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
źródło
4

Przekonałem się, że obrazy w folderze z możliwością rysowania zostaną przekonwertowane na znacznie większy obraz na telefonach o wysokiej rozdzielczości. Na przykład obraz 200k zostanie ponownie próbkowany do wyższej rozdzielczości, takiej jak 800k lub 32000k. Musiałem to odkryć na własną rękę i do tej pory nie widziałem dokumentacji dla tej pułapki pamięci sterty. Aby temu zapobiec, umieszczam wszystko w folderze nodpi z możliwością rysowania (oprócz korzystania z „opcji” w BitmapFactory na podstawie stosu urządzeń). Nie mogę sobie pozwolić na powiększenie mojej aplikacji wieloma folderami, które można wyciągać, zwłaszcza, że ​​zakres definicji ekranów jest teraz ogromny. Trudne jest to, że studio nie wskazuje teraz specjalnie folderu „drawable-nodpi” jako takiego w widoku projektu, po prostu pokazuje folder „drawable”. Jeśli nie będziesz ostrożny, gdy upuścisz obraz do tego folderu w studio, wygra „

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.

wprowadź opis zdjęcia tutaj

Pamiętaj, aby kliknąć w oknie dialogowym folder nodpi, ponieważ widok projektu nie pokaże wszystkich folderów z możliwością rysowania osobno, tak jak kiedyś, więc nie będzie od razu widoczne, że poszło do niewłaściwego. Studio odtworzyło dla mnie wanilię „dającą się rysować” po tym, jak ją usunąłem dawno temu:

wprowadź opis zdjęcia tutaj

Androidcoder
źródło
3

To działało dla mnie: po prostu przenieś obrazy z folderu do rysowania do drawable-hdpi.

Hossein Amini
źródło
jakie jest tego wytłumaczenie? dlaczego to przeprowadzka działa?
Harun,
proszę wyjaśnić, dlaczego to działa ...?
X-Black ...
3

Soluton wypróbuj to w pliku manifestu i użyj Glide Library

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

Użyj tej biblioteki

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

Jego działanie 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
źródło
3

dodać to do swojego manifestu w ramach aplikacji? android: largeHeap = "true"

SAURABH OMER
źródło
mają jeszcze jedno rozwiązanie: zmień wysokość = wysokość * .75 i szerokość = szerokość * .75.
SAURABH OMER
2

Też miałem problem.

To samo z większością innych powyżej. Problem jest spowodowany dużym obrazem.

Po prostu zmień rozmiar niektórych zdjęć i nie musisz zmieniać żadnego kodu.

Mike Yan
źródło
2

W niektórych przypadkach (np. Operacje w pętli) moduł odśmiecania jest wolniejszy niż kod. Możesz użyć metody pomocniczej z tej odpowiedzi, aby poczekać na moduł odśmiecający .

Strefa
źródło
1

Jestem nowicjuszem w tworzeniu Androida, ale mam nadzieję, że moje rozwiązanie pomoże, działa idealnie w moim stanie. Korzystam z Imageview i ustawiam tło na „src”, ponieważ próbuję utworzyć animację klatki. Wystąpił ten sam błąd, ale gdy próbowałem to zakodować, zadziałało

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();
MhoniqueFlores
źródło
1

Zetknąłem się z tym problemem, gdy nie zabiłem mojej starej aktywności, przechodząc do nowej działalności. Naprawiłem tofinish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();
Jason Hu
źródło
1
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

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

50/100, jeśli używa się 100, oryginalna rozdzielczość może zatrzymać aplikacje na brak pamięci.

jeśli 50 lub mniej niż 100, będzie to 50% lub mniej niż 100, więc zapobiegnie to problemowi braku pamięci

RAHINUR RAHMAN
źródło
1

Musisz zmienić rozmiar obiektu w rysunku. Jest za duży, by go wyświetlić. np. jeśli ustawiasz obraz, wypróbuj obraz z mniejszą liczbą pikseli. Mi to pasuje. Dzięki. :)

Ali Hassan Qureshi
źródło
1

Twoja aplikacja ulega awarii, ponieważ rozmiar obrazu (w MB lub KB) jest zbyt duży więc nie przeznacza na to miejsca. Tak więc przed wklejeniem obrazu do rysowania po prostu zmniejsz rozmiar.

LUB

Możesz dodać etykietę Obserwacja w aplikacji na Manifest.xml

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

Po dodaniu tej aplikacji nie zawiesza się.

  • zawsze używaj mniejszych rozmiarów obrazów w aplikacji.
  • Jeśli dodajesz duże rozmiary obrazów w aplikacji, powinieneś dodać powyższą składnię, ale rozmiar aplikacji wzrośnie.
Rhaldar
źródło
1

Mój problem rozwiązany po dodaniu

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

w pliku Build.Gradle

Midhilaj
źródło
To sprawia, że ​​twoja aplikacja jest naprawdę
nadmiernie obciążona
@ cricket_007 Jakie są tego konsekwencje, jeśli w ogóle?
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
źródło
0

Podczas przesyłania obrazu spróbuj zmniejszyć jakość obrazu, który jest drugim parametrem mapy bitowej. To było rozwiązanie w moim przypadku. Wcześniej było 90, potem próbowałem z 60 (jak teraz w kodzie poniżej).

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();
Teo Mihaila
źródło
0

Wypróbuj najprostszy. Być może Twoja aplikacja ulega awarii, ponieważ rozmiar obrazu (w MB) jest zbyt duży, więc nie przeznacza na to miejsca. Więc przed wklejeniem obrazu do rysowania po prostu zmniejsz rozmiar przy pomocy dowolnego oprogramowania przeglądarki lub jeśli pobierasz obraz z galerii w czasie wykonywania, niż przed zapisaniem go skompresuj swoją mapę bitową. To zadziałało dla mnie. na pewno dla ciebie będzie.

neens
źródło
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();

Następnie w znaczniku aplikacji dodaj largeheapsize = "true

satish mobapp dev
źródło
0

Przypuszczam, że chcesz użyć tego obrazu jako ikony. Jak mówi Android, twój obraz jest za duży. Wystarczy skalować obraz, aby system Android wiedział, jaki rozmiar obrazu użyć i kiedy zgodnie z rozdzielczością ekranu. Aby to zrobić, w Android Studio: 1. kliknij prawym przyciskiem myszy folder res, 2. wybierz Zasób obrazu 3. Wybierz ikonę Typ 4. Nadaj ikonie nazwę 5. Wybierz Obraz na Typ zasobu 6. Przytnij obraz Kliknij przycisk Dalej i zakończ . W swoim pliku XML lub źródłowym po prostu odwołaj się do obrazu, który będzie teraz znajdował się w folderze układu lub mipmap zgodnie z wybranym typem zasobu. Błąd zniknie.

Simbarashe Mupfururirwa
źródło
0

Naprawdę nie polecam edytowania takiego manifestu

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

Te opcje nie powodują płynnego efektu animacji w Twojej aplikacji. Ponadto „liveData” lub zmiana lokalnego DB (Sqlite, Room) aktywują się powoli. Jest to niekorzystne dla wygody użytkownika.

Dlatego polecam ZMIEŃ ROZMIAR

Poniżej znajduje się przykładowy kod

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
źródło
0

Jeśli android: largeHeap = „true” nie działał dla ciebie

1:

Kompresja obrazu. Korzystam z tej strony

2:

Konwertuj obrazy na mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Używam tego webiste

Nie usuwaj Androida: largeHeap = "true"!

Shahzad Afridi
źródło
-1

Użyj biblioteki ładowania obrazu, takiej jak Picasso lub Glide . Korzystanie z tych bibliotek zapobiegnie awariom w przyszłości.

Władysław Panczenko
źródło