Android: java.lang.OutOfMemoryError: Gagal mengalokasikan alokasi 23970828 byte dengan 2097152 byte gratis dan 2MB hingga OOM

355

Saya ingin menunjukkan gambar Bitmap di ImageView dari kartu sd yang sudah disimpan. Setelah menjalankan aplikasi saya crash dan mendapatkan OutOfMemoryError kesalahan dari:

(java.lang.OutOfMemoryError: Gagal mengalokasikan alokasi 23970828 byte dengan 2097152 byte gratis dan 2MB hingga OOM)

Saya tidak tahu atau mengapa itu keluar dari memori. Saya pikir ukuran gambar saya sangat besar jadi saya mencoba mengubahnya.

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

Informasi log kucing:

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
sumber
4
periksa piksel gambar, lebarnya tidak boleh melebihi 1440 dan tinggi 2560, dengan melakukan ini tidak akan menampilkan OutOfMemoryError
Pankaj Lilan
1
@PankajLilan Di mana Anda menemukan nilai-nilai ini (1440 X 2560)? Adakah referensi dari dokumentasi android?
LCJ

Jawaban:

525

OutOfMemoryError adalah masalah paling umum yang terjadi di android sementara terutama berurusan dengan bitmap. Kesalahan ini dilemparkan oleh Java Virtual Machine (JVM) ketika suatu objek tidak dapat dialokasikan karena kurangnya ruang memori dan juga, pengumpul sampah tidak dapat membebaskan beberapa ruang.

Seperti yang disebutkan oleh Aleksey, Anda dapat menambahkan entitas di bawah ini dalam file manifes Anda android:hardwareAccelerated="false", android:largeHeap="true"ini akan berfungsi untuk beberapa lingkungan.

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

Anda harus benar-benar membaca beberapa konsep Pengembang Android, khususnya di sini: Menampilkan Bitmap dengan Efisien

Baca semua 5 topik dan tulis ulang kode Anda lagi. Jika masih tidak berfungsi, kami akan senang melihat kesalahan Anda dalam materi tutorial.

Di sini beberapa kemungkinan jawaban untuk jenis kesalahan dalam SOF ini

Android: BitmapFactory.decodeStream () kehabisan memori dengan file 400KB dengan tumpukan 2MB gratis

Bagaimana mengatasi masalah java.lang.OutOfMemoryError di Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Solusi untuk OutOfMemoryError: ukuran bitmap melebihi anggaran VM

Sunting: Dari komentar @cjnash

Bagi siapa pun yang masih mengalami crash setelah mereka menambahkan baris ini, coba tempel gambar Anda ke folder res / drawable-xhdpi / Anda alih-alih res / drawable / dan ini mungkin menyelesaikan masalah Anda.

Raja Misa
sumber
1
Bisakah Anda memposting bagaimana Anda akhirnya menyelesaikan masalah? Karena saya memiliki masalah yang sama ... Sebenarnya Anda dapat menambahkan manifes Anda di baris ini android: hardwareAccelerated = "false", android: largeHeap = "true" ini berfungsi untuk beberapa situasi, tetapi perlu diketahui bahwa bagian lain dari kode dapat berdebat dengan ini ...
Aleksey Timoshchenko
6
navigasi aplikasi menjadi sangat lambat setelah menambahkan ini.
Uma Achanta
10
android: hardwareAccelerated = "false" membekukan aplikasi Anda
Rahim Rahimov
1
Bagi siapa pun yang masih mengalami crash setelah mereka menambahkan baris ini, coba tempel gambar Anda ke folder res / drawable-xhdpi / Anda alih-alih res / drawable / dan ini mungkin menyelesaikan masalah Anda.
cjnash
6
mengapa Anda menyarankan android: hardwareAccelerated = "false? apa manfaatnya?
batmaci
86

Sudahkah Anda mencoba menambahkan ini ke manifes Anda di bawah aplikasi? android:largeHeap="true"?

seperti ini

  <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
sumber
17
Saya telah mencoba dengan android ini: largeHeap = "true" tetapi mendapatkan kesalahan yang sama
androidTag
1
coba tekan gambar Anda sebelum Anda dapat menggunakan tautan ini untuk melakukannya tinyjpg.com
TSG
1
Anda juga dapat mengompresi png dengan situs ini
TSG
27

Bagi saya, masalahnya adalah bahwa file .png saya sedang de-kompresi menjadi bitmap yang sangat besar dalam memori, karena gambar memiliki dimensi yang sangat besar (walaupun ukuran file kecil).

Jadi perbaikannya adalah dengan hanya mengubah ukuran gambar :)

petrus-jvrensburg
sumber
4
ini adalah solusi yang tepat, karena saya pertama kali mencoba solusi di atas, tetapi setelah menerapkan android:hardwareAccelerated="false", beberapa animasi seperti layout shadow tidak berfungsi. Tetapi setelah mengubah ukuran semua masalah diselesaikan, terima kasih! +1 untuk petunjuk ini!
Kaushal28
1
ini memperbaiki masalah saya. Terima kasih @petrus
Hùng Nguyễn
27

Sebenarnya Anda dapat menambahkan dalam manifes Anda baris ini android:hardwareAccelerated="false", android:largeHeap="true"ini berfungsi untuk beberapa situasi, tetapi perlu diketahui bahwa bagian lain dari kode dapat berdebat dengan ini.

<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
sumber
2
tidak berfungsi, macet dengan kesalahan yang sama, ketika digunakan Bitmap.createBitmap
Narendra Singh
@ Raja maaf (saya juga menghabiskan beberapa waktu untuk menyelesaikan masalah ini, dan ini bekerja untuk saya. Tapi itu hanya salah satu cara ... Ada banyak pendekatan yang berbeda
Aleksey Timoshchenko
2
Apa tujuan dari android: hardwareAccelerated = "false" ?
IgorGanapolsky
@IgorGanapolsky Dari dokumen resmi berkata .. lihat tautan ini
Shylendra Madda
27

Ini seharusnya bekerja

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

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

Ubah ukuran gambar Anda sebelum mengatur ke ImageView seperti ini:

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

di mana ukuran adalah ukuran sebenarnya dari ImageView. Anda dapat mencapai ukuran dengan mengukur:

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

dan gunakan ukuran berikutnya imageView.getMeasuredWidth()dan imageView.getMeasuredHeight()untuk scaling.

Vladimir Eremeev
sumber
Saya telah mencoba dengan android ini: largeHeap = "true" tetapi mendapatkan kesalahan yang sama
androidTag
Contoh lebih lanjut mengapa hal ini tidak selalu berhasil (menggunakan penyimpanan aplikasi pribadi): Menempatkan bitmap di res / drawable / dapat memberikan kesalahan yang sama tetapi tidak akan terjadi setiap saat. Menempatkan bitmap yang sama ke dalam res / drawable-xhdpi / tidak akan lagi memiliki kesalahan. Jadi sebagai jawaban, itu tidak benar dengan sendirinya.
CmosBattery
8

Gunakan Glide Library dan Override ukuran ke ukuran kurang;

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

Saya mendapat kesalahan di bawah ini

"E / art: Throwing OutOfMemoryError" Gagal mengalokasikan alokasi 47251468 byte dengan 16777120 byte gratis dan 23MB hingga OOM "

setelah menambahkan android:largeHeap="true"di AndroidManifest.xml maka saya menghilangkan semua kesalahan

<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
sumber
5

Masalah: Gagal mengalokasikan alokasi 37748748 byte dengan 16777120 byte gratis dan 17MB hingga OOM

Solusi: 1. buka file manifes Anda 2. di dalam tag aplikasi cukup tambahkan di bawah dua baris

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

Contoh:

 <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
sumber
4

Saya telah mengatasi masalah ini dengan mengubah ukuran gambar ke ukuran yang lebih rendah. Saya menggunakan formulir xamarin. mengurangi ukuran gambar PNG menyelesaikan masalah.

maxspan
sumber
4

Saya telah menemukan bahwa gambar dalam folder 'drawable' akan dikonversi menjadi gambar yang jauh lebih besar pada ponsel berdefinisi tinggi. Sebagai contoh, gambar 200k akan diresampled ke resolusi yang lebih tinggi, seperti 800k atau 32000k. Saya harus menemukan ini sendiri dan sampai saat ini belum melihat dokumentasi untuk perangkap memori tumpukan ini. Untuk mencegah hal ini, saya meletakkan semuanya di folder drawable-nodpi (selain menggunakan 'opsi' di BitmapFactory berdasarkan tumpukan perangkat tertentu). Saya tidak mampu membuat ukuran aplikasi saya membengkak dengan beberapa folder yang dapat digambar, terutama karena rentang kekurangan layar sekarang sangat luas. Yang sulit adalah studio sekarang tidak secara khusus menunjukkan folder 'drawable-nodpi' seperti dalam tampilan proyek, itu hanya menunjukkan folder 'drawable'. Jika Anda tidak hati-hati, ketika Anda menjatuhkan gambar ke folder ini di studio, itu tidak akan

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.

masukkan deskripsi gambar di sini

Pastikan untuk mengeklik ke bawah ke folder nodpi di dialog, karena tampilan proyek tidak akan menunjukkan semua folder yang dapat digambar secara terpisah seperti dulu, sehingga tidak akan langsung terlihat bahwa itu salah. Studio membuat ulang vanilla 'drawable' di beberapa titik bagi saya setelah saya menghapusnya sejak lama:

masukkan deskripsi gambar di sini

Androidcoder
sumber
3

Ini bekerja untuk saya: hanya memindahkan gambar dari folder yang dapat ditarik ke drawable-hdpi.

Hossein Amini
sumber
apa penjelasan dari ini? mengapa pemindahan ini bekerja?
Harun
tolong jelaskan mengapa ini bekerja ...?
X-Black ...
3

Soluton coba ini di File Manifest Anda dan gunakan Glide Library

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

Gunakan perpustakaan ini

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

Ini Coding Selamat Bekerja

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
sumber
3

tambahkan ini ke manifes Anda di bawah aplikasi? android: largeHeap = "true"

SAURABH OMER
sumber
juga memiliki satu solusi lagi: ubah tinggi = tinggi * .75 dan lebar = lebar * .75.
SAURABH OMER
2

Saya punya masalah juga.

Sama dengan kebanyakan orang lain di atas. Masalahnya disebabkan oleh gambar besar.

Ubah ukuran beberapa gambar, dan tidak perlu mengubah kode apa pun.

Mike Yan
sumber
2

Dalam beberapa kasus (misalnya operasi dalam satu lingkaran) pengumpul sampah lebih lambat dari kode Anda. Anda dapat menggunakan metode pembantu dari jawaban ini untuk menunggu pengumpul sampah .

Zon
sumber
1

Saya seorang pemula dalam pengembangan Android tapi saya harap solusi saya membantu, ini berfungsi dengan baik pada kondisi saya. Saya menggunakan Imageview dan mengatur latar belakangnya menjadi "src" karena saya mencoba membuat bingkai animasi. Saya mendapat kesalahan yang sama tetapi ketika saya mencoba kode ini berhasil

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

Saya mengalami masalah ini ketika saya tidak mematikan aktivitas lama saya ketika pindah ke aktivitas baru. Saya memperbaikinya denganfinish();

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

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

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

50/100 jika seseorang menggunakan 100 maka resolusi asli dapat menghentikan Aplikasi karena kehabisan memori.

jika 50 atau kurang dari 100 ini akan menjadi 50% atau kurang dari 100 resolusi sehingga ini akan mencegah masalah memori

RAHINUR RAHMAN
sumber
1

Anda harus mengubah ukuran objek dalam gambar. Terlalu besar untuk ditampilkan oleh android. mis. Jika Anda mengatur gambar coba gambar dengan piksel lebih sedikit. Ini bekerja untuk saya. Terima kasih. :)

Ali Hassan Qureshi
sumber
1

Aplikasi Anda mogok karena ukuran gambar Anda (dalam MB atau KB) terlalu besar sehingga tidak mengalokasikan ruang untuk itu. Jadi sebelum menempelkan gambar Anda di drawable, kurangi saja ukurannya.

ATAU

Anda dapat menambahkan tag aplikasi Mengikuti di Manifest.xml

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

Setelah Menambahkan Aplikasi ini tidak akan Hancur.

  • selalu menggunakan ukuran gambar yang lebih sedikit di Aplikasi.
  • Jika Anda menambahkan ukuran besar gambar dalam aplikasi, Anda harus menambahkan sintaksis di atas, tetapi ukuran Aplikasi akan meningkat.
rhaldar
sumber
1

Masalah saya terpecahkan setelah menambahkan

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

dalam file Build.Gradle

Midhilaj
sumber
Ini hanya membuat aplikasi Anda benar-benar membengkak dalam penggunaan memori
OneCricketeer
@ cricket_007 Apa akibatnya jika ada?
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
sumber
0

Jika mengunggah gambar, coba kurangi kualitas gambar, yang merupakan parameter kedua dari Bitmap. Ini adalah solusi dalam kasus saya. Sebelumnya itu 90, kemudian saya coba dengan 60 (seperti pada kode di bawah sekarang).

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

Coba yang paling sederhana. Mungkin aplikasi Anda mogok karena ukuran gambar Anda (dalam MB) terlalu besar sehingga tidak mengalokasikan ruang untuk itu. Jadi sebelum menempelkan gambar Anda di drawable, kurangi ukurannya dengan perangkat lunak viewer apa pun atau jika Anda mengambil gambar dari galeri saat run time daripada sebelum menyimpannya, kompres bitmap Anda. Ini berhasil untuk saya. pasti untuk kamu akan.

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

Kemudian dalam tag Appliaction, tambahkan bigheapsize = "true

sathish mobapp dev
sumber
0

Saya kira Anda ingin menggunakan gambar ini sebagai ikon. Seperti yang diberitahukan Android kepada Anda, gambar Anda terlalu besar. Yang perlu Anda lakukan adalah skala gambar Anda sehingga Android tahu ukuran gambar yang digunakan dan kapan sesuai dengan resolusi layar. Untuk mencapai ini, di Android Studio: 1. klik kanan pada folder res, 2. pilih Image Asset 3. Pilih ikon Type 4. Beri ikon nama 5. Pilih Image on Asset Type 6. Trim gambar Anda Klik next dan selesai . Di xml atau kode sumber Anda cukup merujuk ke gambar yang sekarang akan berada baik di tata letak atau folder mipmap sesuai dengan jenis aset yang dipilih. Kesalahan akan hilang.

Simbarashe Mupfururirwa
sumber
0

Saya tidak merekomendasikan pengeditan manifes seperti ini

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

Opsi ini menyebabkan efek animasi tidak lancar pada aplikasi Anda. Selain itu 'liveData' atau mengubah DB lokal Anda (Sqlite, Room) aktifkan secara perlahan. Ini buruk untuk pengalaman pengguna.

Jadi saya sarankan RESIZE bitmap

Di bawah ini adalah kode sampel

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.agon
sumber
0

Jika android: largeHeap = "true" tidak berfungsi untuk Anda

1:

Kompresi Gambar. Saya menggunakan situs web ini

2:

Konversi gambar ke mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Saya menggunakan webiste ini

Jangan hapus android: largeHeap = "true"!

Shahzad Afridi
sumber
-1

Gunakan perpustakaan pemuatan gambar seperti Picasso atau Glide . Menggunakan perpustakaan ini akan mencegah crash di masa depan.

Vladyslav Panchenko
sumber