Android: java.lang.OutOfMemoryError: не вдалося виділити 23970828 байт-розподілу з 2097152 вільними байтами та 2 Мб до OOM


355

Я хочу показати зображення Bitmap у ImageView із SD-карти, яка вже зберігається. Після запуску моє додаток завершує роботу та отримує помилку OutOfMemoryError :

(java.lang.OutOfMemoryError: Не вдалося виділити 23970828 байт-розподілу з 2097152 вільними байтами та 2 Мб до OOM)

Я поняття не маю або чому це поза пам'яттю. Я думаю, що розмір мого зображення дуже великий, тому я спробував його змінити.

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

Інформація про котик журналу:

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
перевіряйте пікселі зображення, ширина не повинна перевищувати 1440, а висота 2560, при цьому це не відображатиметься OutOfMemoryError
Pankaj Lilan

1
@PankajLilan Де ти знайшов ці значення (1440 X 2560)? Будь-які посилання з документації на Android?
LCJ

Відповіді:


525

OutOfMemoryError - найпоширеніша проблема, що виникає в андроїді, особливо це стосується растрових зображень. Ця помилка викидається віртуальною машиною Java (JVM), коли об’єкт неможливо виділити через брак пам'яті, а також збирач сміття не може звільнити деякий простір.

Як згадував Олексій, ви можете додати нижче сутності у свій файл маніфесту 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">

Ви повинні точно ознайомитися з деякими концепціями розробників Androids, спеціально тут: Ефективне відображення растрових зображень

Прочитайте всі 5 тем і перепишіть свій код ще раз. Якщо це все ще не працює, ми будемо раді бачити, що ви зробили не так з матеріалами підручника.

Ось кілька можливих відповідей на подібні помилки в SOF

Android: BitmapFactory.decodeStream () залишився без пам’яті з файлом у 400 КБ та безліччю 2 МБ

Як вирішити проблему java.lang.OutOfMemoryError в Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Рішення для OutOfMemoryError: розмір растрових зображень перевищує бюджет VM

Редагувати: З коментарів @cjnash

Для тих, у кого все-таки виникали збої після додавання цього рядка, спробуйте вставити зображення в папку res / dravable-xhdpi / замість res / drawable /, і це може вирішити вашу проблему.


1
Не могли б ви опублікувати, як ви врешті-решт вирішили проблему? Тому що у мене така ж проблема ... Насправді ви можете додати в свій маніфест цей рядок android: hardwareAccelerated = "false", android: largeHeap = "true" він працює в деяких ситуаціях, але пам'ятайте, що інша частина коду може сперечатися з цим ...
Олексій Тимощенко

6
Навігація в додатках стає дуже повільною після додавання цього.
Ума Аханта

10
android: hardwareAccelerated = "помилково" заморожуючи ваш додаток
Рахім Рахімов

1
Для тих, у кого все-таки виникали збої після додавання цього рядка, спробуйте вставити зображення в папку res / dravable-xhdpi / замість res / drawable /, і це може вирішити вашу проблему.
cjnash

6
чому б ви запропонували android: hardwareAccelerated = "false? яка користь від цього?"
batmaci

86

ви намагалися додати це до свого маніфесту під додатками? android:largeHeap="true"?

подобається це

  <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
Я намагався з цим андроїдом: LargeHeap = "вірно", але отримую ту ж помилку
androidTag

1
спробуйте стиснути своє зображення, перш ніж ви зможете скористатися цим посиланням, щоб зробити це tinyjpg.com
TSG

1
ви також можете стиснути png за допомогою цього сайту
TSG

27

Для мене проблема полягала в тому, що мій .png файл видалявся, щоб бути дійсно величезною растровою пам’яттю, оскільки зображення мало дуже великі розміри (хоча розмір файлу був невеликим).

Тож виправлення полягало в тому, щоб просто змінити розмір зображення :)


3
це правильне рішення, тому що я спершу спробував вище рішення, але після застосування android:hardwareAccelerated="false"деякі анімації, такі як тінь макета, не працювали. Але після зміни розміру всі проблеми були вирішені дякую! +1 за цей підказку!
Kaushal28

1
це вирішило мою проблему. Дякую @petrus
Nguyễn

27

Насправді ви можете додати в свій маніфест ці рядки 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">

2
не вийшло, він вийшов із тієї ж помилки, коли використовувався Bitmap.createBitmap
Narendra Singh

@ Кінг вибачте (я також витратив деякий час, щоб вирішити це питання, і для мене це робота. Але це лише один із способів ... Є багато іншого підходу
Олексій Тимощенко,

2
Яка мета андроїда: hardwareAccelerated = "false" ?
ІгорГанапольський

@IgorGanapolsky Від офіційного doc каже .. дивіться це посилання
Shylendra Madda

27

Це має спрацювати

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

Змініть розмір зображення перед налаштуванням до ImageView так:

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

де розмір - фактичний розмір ImageView. Ви можете досягти розміру, вимірявши:

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

і використовувати наступний розмір imageView.getMeasuredWidth()і imageView.getMeasuredHeight()для scaling.


Я намагався з цим андроїдом: LargeHeap = "вірно", але отримую ту ж помилку
androidTag

Наступний приклад того, чому це не обов'язково спрацює (використовуючи приватне сховище додатків): Розміщення растрової карти в res / dravable / може призвести до тієї ж помилки, але вона не відбуватиметься кожного разу. Якщо розмістити ту саму растрову карту в res / dravable-xhdpi /, більше не буде помилки. Отже, як відповідь, вона не є правильною сама по собі.
CmosBattery

8

Використовуйте Бібліотеку ковзання та Замініть розмір на менший розмір;

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

6

Я потрапив нижче помилки

"E / art: Throwing OutOfMemoryError" Не вдалося виділити 47251468 байт-розподілу з 16777120 вільними байтами та 23 Мб до OOM "

після додавання android:largeHeap="true"в AndroidManifest.xml я позбувся всіх помилок

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

4

Я вирішив цю проблему, змінивши розмір зображення на менший розмір. Я використовую форму ксамарину. зменшення розміру зображення PNG вирішило проблему.


4

Проблема: Не вдалося виділити розподіл 37748748 байт із 16777120 вільними байтами та 17 Мб до OOM

Рішення: 1.відкрийте файл маніфесту 2. всередині тегу програми просто додайте нижче двох рядків

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

Приклад:

 <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

Я виявив, що зображення в папці "dravable" будуть перетворені на значно більші зображення на телефонах високої чіткості. Наприклад, зображення в 200 тис. Разів буде перекомплектовано на більш високу роздільну здатність, наприклад, 800 Кб або 32000 Кб. Мені довелося це відкрити самостійно і до цього часу не бачив документації для цієї пастки пам’яті. Щоб запобігти цьому, я помістив усе в папку, що малюється-nodpi (на додаток до використання "параметрів" у BitmapFactory на основі конкретної купи пристрою). Я не можу собі дозволити, щоб розмір мого додатка був роздутий кількома малювальними папками, тим більше, що діапазон екраноохоронних програм зараз такий великий. Найскладніша річ, що студія зараз конкретно не вказує папку 'dravable-nodpi' як таку у поданні проекту, вона просто показує папку 'dravable'. Якщо ви не обережні, коли ви кидаєте зображення в цю папку в студії, воно виграє "

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.

введіть тут опис зображення

Не забудьте натиснути папку nodpi у діалозі, оскільки в проекті не з’являться всі папки, що витягуються окремо, як раніше, тому не буде відразу очевидно, що вона перейшла в неправильну. Студія відтворила ваніль, яку можна «намалювати» в якийсь момент для мене після того, як я її давно видалив:

введіть тут опис зображення


3

Це працювало для мене: просто переміщуйте зображення з папки, що витягується, в файл, що малюється, hdpi.


яке пояснення цьому? чому це рухоме працює?
Харун

pls поясніть, чому це працює ...?
X-Black ...

3

Soluton спробуйте це у файлі Manifest та використовуйте Бібліотеку Glide

компілювати '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 = "помилково"

android: largeHeap = "вірно"

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

Використовуйте цю бібліотеку

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

Його робоче щасливе кодування

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

додати це до свого маніфесту під додатками? android: largeHeap = "вірно"


також є ще одне рішення: зміна висоти = висота * .75 і ширина = ширина * .75.
SAURABH OMER

2

У мене теж була проблема.

Те саме з більшістю інших вище. Проблема викликана величезним іміджем.

Просто змініть розмір деяких зображень і не потрібно змінювати жоден код.



1

Я новачок в андроїд, що розвивається, але сподіваюся, що моє рішення допоможе, воно прекрасно працює на моєму стані. Я використовую Imageview і встановіть його фон "src", тому що я намагаюся зробити анімацію кадру. Я отримав ту ж помилку, але коли я спробував зашифрувати це, це спрацювало

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

1

Я зіткнувся з цією проблемою, коли не перебив свою стару діяльність, переходячи до нової діяльності. Я це зафіксувавfinish();

    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, якщо використовується 100, тоді оригінальна роздільна здатність може зупинити Програми для пам'яті.

якщо 50 або менше 100, це буде 50% або менше, ніж 100 роздільною здатністю, це запобіжить виникнення проблеми із пам'яттю


1

Ви повинні змінити розмір об'єкта в малюванні. Він занадто великий для андроїда для відображення. Наприклад, якщо ви встановлюєте зображення, спробуйте зображення з меншою кількістю пікселів. Це працює для мене. Дякую. :)


1

У вашому додатку виходить з ладу, оскільки розмір зображення (у МБ або КБ) занадто великий, тому він не виділяє місця для цього. Тому перед тим, як вставити зображення в малюнок, просто зменшіть розмір.

АБО

Ви можете додати Next у тег програми на Manifest.xml

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

Після додавання цього додатка не вийде з ладу.

  • завжди використовуйте зображення менших розмірів в додатку.
  • Якщо ви додаєте зображення у великих розмірах у програму, слід додати вище синтексу, але розмір додатка збільшиться.

1

Мою проблему вирішено після додавання

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

у файлі Build.Gradle


Це просто робить ваш додаток дуже роздутим у використанні пам'яті
OneCricketeer

@ cricket_007 Що є наслідком цього, якщо він є?
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

Якщо ви завантажуєте зображення, спробуйте зменшити якість зображення, що є другим параметром Bitmap. Це було рішення в моєму випадку. Раніше це було 90, потім я спробував з 60 (як це в коді нижче).

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

0

Спробуйте найпростіший. Можливо, ваш додаток виходить з ладу, оскільки розмір зображення (у МБ) занадто великий, тому він не виділяє місця для цього. Тому перед тим, як вставити зображення в малюнок, просто зменшіть розмір будь-яким програмним забезпеченням для перегляду або якщо ви знімаєте зображення з галереї на час виконання, ніж перед тим, як зберегти його, стискайте вашу растрову карту. Це працювало для мене. безумовно, для u буде.


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

Потім у тег Appliaction додайте bigheapsize = "true


0

Я думаю, ви хочете використовувати це зображення як значок. Як вам каже Android, ваше зображення занадто велике. Що потрібно просто зробити, це масштабувати зображення, щоб Android знав, який розмір зображення використовувати та коли відповідно до роздільної здатності екрана. Для цього в Android Studio: 1. клацніть правою кнопкою миші на папці res, 2. виберіть Image Asset 3. Виберіть піктограму Type 4. Дайте піктограму ім'я 5. Виберіть Image на Тип активу 6. Обріжте зображення. . У своєму xml або вихідному коді просто зверніться до зображення, яке тепер буде розташоване або в макеті, або в папці mipmap, відповідно до обраного типу ресурсу. Помилка піде.


0

Я не рекомендую редагувати маніфест, як це

android: hardwareAccelerated = "хибно", android: largeHeap = "вірно"

Ці параметри викликають не плавний ефект анімації на вашому додатку. Більше того, "liveData" або зміна локального БД (Sqlite, Room) активується повільно. Це погано для користувачів.

Тому я рекомендую РОЗМІРИТИ растровий малюнок

Нижче наведено зразок коду

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" тоді для вас не працював

1:

Стиснення зображення Я використовую цей веб-сайт

2:

Перетворення зображень у mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Я використовую цей Webiste

Не видаляйте android: largeHeap = "вірно"!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.