Android: java.lang.OutOfMemoryError: 2097152 boş bayt ve OOM'a kadar 2 MB ile 23970828 bayt ayırma başarısız oldu


356

Zaten saklanan sd karttan ImageView Bitmap görüntüsünü göstermek istiyorum . Çalıştırdıktan sonra benim uygulama çöküyor ve OutOfMemoryError hatası alıyorum :

(java.lang.OutOfMemoryError: 2097152 boş bayt ve OOM'a kadar 2 MB ile 23970828 bayt ayırma başarısız oldu)

Hiçbir fikrim yok ya da neden belleği yetersiz. Sanırım görüntü boyutum çok büyük, bu yüzden değiştirmeye çalıştım.

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

Log cat bilgileri:

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
Görüntünün piksellerini kontrol edin, genişlik
1440'ı

1
@PankajLilan Bu değerleri nerede buldunuz (1440 X 2560)? Android belgelerinden referans var mı?
LCJ

Yanıtlar:


526

OutOfMemoryError , özellikle bitmap'lerle uğraşırken android'de meydana gelen en yaygın sorundur. Bu hata, Java Sanal Makinesi (JVM) tarafından bellek alanı yetersizliği nedeniyle bir nesne tahsis edilemediğinde ve ayrıca çöp toplayıcıda yer açamadığında atılır.

Aleksey tarafından belirtildiği gibi, manifest dosyanıza aşağıdaki varlıkları ekleyebilirsiniz android:hardwareAccelerated="false", android:largeHeap="true"bazı ortamlar için çalışacaktır.

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

Android Geliştirici kavramlarından bazılarını kesinlikle okumalısınız, özellikle burada: Bitmap'leri Verimli Bir Şekilde Görüntüleme

5 konunun tamamını okuyun ve kodunuzu tekrar yazın. Hala işe yaramazsa, öğretici materyalle neyi yanlış yaptığınızı görmekten memnuniyet duyarız.

SOF'deki bu tür hatalar için bazı olası cevaplar

Android: BitmapFactory.decodeStream (), 2 MB boş yığın içeren 400 KB dosya ile bellek yetersiz

Android'de java.lang.OutOfMemoryError sorunu nasıl çözülür?

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

OutOfMemoryError için çözüm: bitmap boyutu VM bütçesini aşıyor

Düzenle: @cjnash yorumlarından

Bu satırı ekledikten sonra hala kilitlenenler için resminizi res / drawable / yerine res / drawable-xhdpi / klasörünüze yapıştırmayı deneyin ve sorununuzu çözebilir.


1
Sonunda sorunu nasıl çözdüğünüzü söyler misiniz? Çünkü ben aynı sorun var ... Aslında manifest bu satırları ekleyebilirsiniz android: hardwareAccelerated = "yanlış", android: largeHeap = "true" bazı durumlar için çalışıyor, ama unutmayın kodun başka bir parçası olabilir bununla tartışmak ...
Aleksey Timoshchenko

6
uygulama navigasyonu bunu ekledikten sonra çok yavaşlıyor.
Uma Achanta

10
android: hardwareAccelerated = "yanlış" uygulamanızı donduruyor
Rahim Rahimov

1
Bu satırı ekledikten sonra hala kilitlenenler için resminizi res / drawable / yerine res / drawable-xhdpi / klasörünüze yapıştırmayı deneyin ve sorununuzu çözebilir.
cjnash

6
neden android önerirsin: hardwareAccelerated = "yanlış? bunun yararı nedir?
batmaci

86

bunu uygulamalar altında manifestinize eklemeyi denediniz mi? android:largeHeap="true"?

bunun gibi

  <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
Bu android ile denedim: largeHeap = "true" ama aynı hatayı alıyorum
androidTag

1
Bunu yapmak için önce görüntünüzü sıkıştırmayı deneyin tinyjpg.com
TSG

1
Ayrıca, bu siteyle png sıkıştırabilirsiniz
TSG

27

Benim için sorun, .png dosyamın bellekte gerçekten büyük bir bitmap olması için sıkıştırılmış olmasıydı, çünkü görüntü çok büyük boyutlara sahipti (dosya boyutu küçük olsa bile).

Yani düzeltme sadece görüntüyü yeniden boyutlandırmak oldu :)


4
Bu doğru çözümdür, çünkü öncelikle yukarıdaki çözümleri denedim, ancak uyguladıktan sonra android:hardwareAccelerated="false"düzen gölgesi gibi bazı animasyonlar çalışmıyor. Ama yeniden boyutlandırdıktan sonra tüm sorunlar çözüldü teşekkür ederim! Bu ipucu için +1!
Kaushal28

1
bu benim sorunumu çözdü. Thank you @petrus
Hùng Nguyễn

27

Aslında size apaçık Bu satırlardaki ekleyebilir android:hardwareAccelerated="false", android:largeHeap="true"bazı durumlar için çalışıyor, ancak kodun diğer kısmı bu tartışmaya olabilir unutmayın.

<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
işe yaramadı, Bitmap.createBitmap kullanıldığında aynı hatayla çöktü
Narendra Singh

@King özür dilerim (bu sorunu çözmek için de biraz zaman harcadım ve bu benim için işe yarıyor. Ama bu sadece yollardan biri ... Çok farklı bir yaklaşım var
Aleksey Timoshchenko

2
Android'in amacı nedir : hardwareAccelerated = "false" ?
IgorGanapolsky

@IgorGanapolsky Resmi doktordan .. bu bağlantıya bakın
Shylendra Madda

27

Bu çalışmalı

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

ImageView için kurulumdan önce resminizi aşağıdaki gibi yeniden boyutlandırın :

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

burada boyut ImageView'ın gerçek boyutudur. Ölçerek ölçüye ulaşabilirsiniz:

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

ve sonraki boyutu imageView.getMeasuredWidth()ve imageView.getMeasuredHeight()için kullanın scaling.


Bu android ile denedim: largeHeap = "true" ama aynı hatayı alıyorum
androidTag

Bunun neden gerekli olmayacağına dair başka bir örnek (özel uygulama depolama alanı kullanarak): res / drawable / içine bir bitmap yerleştirmek aynı hatayı verebilir, ancak her seferinde gerçekleşmez. Aynı bitmapi res / drawable-xhdpi / içine yerleştirmek artık hata vermeyecektir. Yani bir cevap olarak, kendi başına doğru değil.
CmosBattery

8

Glide Library'yi kullanın ve boyutu daha az boyuta geçersiz kılın;

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

6

Hata aldım

"E / art: OutOfMemoryError Fırlatma" 16777120 boş bayt ve OOM'a kadar 23 MB ile 47251468 bayt ayırma başarısız oldu "

ekledikten sonra android:largeHeap="true" içinde AndroidManifest.xml sonra hataları tüm kurtulmak

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

5

Sorun: OOM kadar 16777120 boş bayt ve 17 MB ile 37748748 bayt ayırma başarısız oldu

Çözüm: 1. manifest dosyanızı açın 2. uygulama etiketi içinde sadece iki satırın altına ekleyin

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

Misal :

 <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

Görüntüyü daha küçük boyutuna getirerek bu sorunu çözdüm. Xamarin formu kullanıyorum. PNG görüntüsünün boyutunu küçültmek sorunu çözdü.


4

'Drawable' klasöründeki resimlerin yüksek çözünürlüklü telefonlarda çok daha büyük bir resme dönüştürüleceğini buldum. Örneğin, 200k'lık bir görüntü 800k veya 32000k gibi daha yüksek bir çözünürlüğe yeniden örneklenir. Bunu kendi başıma keşfetmeliydim ve bugüne kadar bu yığın bellek tuzağı için belge görmedim. Bunu önlemek için her şeyi bir çekilebilir nodpi klasörüne koydum (BitmapFactory'de belirli cihaz yığınına dayalı olarak 'seçenekler' kullanmaya ek olarak). Uygulamamın boyutunun, özellikle ekran defs aralığı şimdi çok geniş olduğu için, birden fazla çekilebilir klasörle şişirilmesini göze alamıyorum. Zor olan şey şu ki, stüdyo şimdi proje görünümünde olduğu gibi 'drawable-nodpi' klasörünü belirtmiyor, sadece bir 'drawable' klasörü gösteriyor. Dikkatli değilseniz, bir resmi stüdyoda bu klasöre bıraktığınızda,

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.

resim açıklamasını buraya girin

Diyalogdaki nodpi klasörünü tıkladığınızdan emin olun, çünkü proje görünümü eskiden olduğu gibi tüm çekilebilir klasörleri ayrı ayrı göstermeyeceğinden, yanlış olana geçtiği hemen görülmeyecektir. Studio, uzun bir süre önce sildikten sonra vanilyayı 'çekilebilir' benim için bir noktada yeniden yarattı:

resim açıklamasını buraya girin


3

Bu benim için çalıştı: sadece çekilebilir klasörden çekilebilir hdpi görüntüleri taşımak.


bunun açıklaması ne? bu hareket neden işe yarıyor?
Harun

3

Soluton bunu Manifest Dosyanızda deneyin ve Glide Library'yi kullanın

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

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

Bu kütüphaneyi kullan

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

Mutlu Kodlama Çalışıyor

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

uygulamalar altında manifestinize eklemek ister misiniz? android: largeHeap = "true"


ayrıca bir çözüm daha var: yüksekliği değiştirin = yükseklik * .75 ve genişlik = genişlik * .75.
SAURABH OMER

2

Ben de problemim vardı.

Yukarıdaki diğerlerinin çoğu ile aynı. Sorun büyük görüntüden kaynaklanıyor.

Sadece bazı görüntüleri yeniden boyutlandırın ve herhangi bir kodu değiştirmenize gerek yok.



1

Ben android geliştirme bir acemi değilim ama umarım benim çözümüm mükemmel, benim durumumda mükemmel çalışır. Imgeview kullanarak ve bir kare animasyon yapmaya çalışıyorum çünkü "src" için arka plan ayarlayın. Aynı hatayı aldım ama kodlamayı denediğimde işe yaradı

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

1

Yeni bir aktiviteye geçerken eski aktivitemi öldürmediğimde bu problemle karşılaştım. İle sabitledimfinish();

    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 kişi 100 kullanıyorsa, orijinal çözünürlük Uygulamaları belleği yetersiz bırakabilir.

50 veya 100'den düşükse, bu% 50 veya 100 çözünürlükten düşük olacaktır, bu nedenle bellek yetersizliği sorunu önlenir


1

Çekilebilir nesnenin boyutunu değiştirmeniz gerekir. Android için görüntülenemeyecek kadar büyük. Örneğin, görüntüyü ayarlıyorsanız, daha az pikselli görüntüyü deneyin. Benim için çalışıyor. Teşekkürler. :)


1

Görüntü boyutunuz (MB veya KB cinsinden) çok büyük olduğundan uygulamanız kilitleniyor bu nedenle alan ayırmıyor. Yani resminizi çekilebilir olarak yapıştırmadan önce boyutunu küçültün.

VEYA

Manifest.xml adresindeki uygulama etiketine aşağıdakileri ekleyebilirsiniz.

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

Bu App ekledikten sonra Crash olmaz.

  • Uygulamada her zaman daha az boyutta görüntüler kullanın.
  • Uygulamaya büyük boyutlarda görüntüler eklerseniz, yukarıdaki syntex'i eklemeniz gerekir, ancak Uygulama boyutu artar.

1

Ekledikten sonra sorunum çözüldü

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

Build.Gradle dosyasında


Bu, uygulamanızı bellek kullanımında gerçekten
şişiriyor

@ cricket_007 Varsa bunun sonucu nedir?
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

Bir görüntü yüklüyorsanız, Bitmap'in ikinci parametresi olan görüntü kalitesini düşürmeyi deneyin. Benim durumumda çözüm buydu. Daha önce 90 yaşındaydı, sonra 60 ile denedim (aşağıdaki kodda olduğu gibi).

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

0

En basit olanı deneyin. Belki uygulamanız çöküyor çünkü resim boyutunuz (MB cinsinden) çok büyük, bu yüzden alan ayırmıyor. Bu nedenle, resminizi çekilebilir olarak yapıştırmadan önce herhangi bir görüntüleyici yazılımı tarafından boyutu küçültün veya çalışma zamanında galeriden görüntü alıyorsanız, kaydetmeden önce bitmap'inizi sıkıştırın. Benim için çalıştı. kesinlikle u için olacak.


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

Sonra Appliaction etiketine largeheapsize = "true


0

Sanırım bu resmi bir simge olarak kullanmak istiyorsunuz. Android size söylediği gibi, resminiz çok büyük. Yapmanız gereken tek şey görüntünüzü ölçeklendirmektir, böylece Android hangi görüntünün boyutunu ve ne zaman ekran çözünürlüğüne göre kullanacağını bilir. Bunu yapmak için Android Studio'da: 1. res klasörünü sağ tıklayın, 2. Görüntü Varlığı'nı seçin 3. Simge Türü'nü seçin 4. Simgeye bir ad verin 5. Varlık Türünde Görüntü'yü seçin 6. Görüntünüzü kırpın İleri'yi tıklayın ve bitirin . Xml veya kaynak kodunuzda, yalnızca seçilen varlık türüne göre mizanpaj veya mipmap klasöründe bulunan resme bakın. Hata ortadan kalkar.


0

Manifest'i böyle düzenlemeyi gerçekten tavsiye etmiyorum

android: hardwareAccelerated = "yanlış", android: largeHeap = "doğru"

Bu seçenekler uygulamanızda düzgün animasyon efektine neden olmaz. Ayrıca 'liveData' ya da yerel DB'nizi (Sqlite, Room) değiştirmek yavaş aktive olur. Kullanıcı deneyimi için kötü.

Bu yüzden RESMAE bitmap'i öneriyorum

Örnek kod aşağıdadır

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

Android: largeHeap = "true" sizin için çalışmadıysa

1:

Görüntü Sıkıştırma. Bu web sitesini kullanıyorum

2:

Görüntüleri mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi'ye dönüştürün. Bu webiste kullanıyorum

Android'i kaldırmayın: largeHeap = "true"!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.