Загрузка изображения Android с SD-карты в ImageView создает ошибку нехватки памяти в Samsung SIII

в моем приложении у меня есть возможность отображать изображения на SD-карте, из которых пользователь может выбрать одно изображение, и оно будет загружено в представлении изображения моего следующего действия.

Я протестировал приложение на двух своих устройствах, таких как Samsung Ace и Samsung Galaxy S3.

В Samsung Ace версии 2.3 я могу выбрать изображение, и из результата onActivity вызывается следующее действие, и изображение загружается в Imageview, здесь я могу сделать это n раз (другой вариант, который я использую, это захватить через камеру и загрузить в следующей активности, здесь тоже процесс хорош)

Когда я попробовал тот же процесс в Samsung Galaxy S3 версии 4.2, я впервые смог выбрать или захватить с помощью камеры и загрузить его в режиме просмотра изображений. Когда я попытался во второй раз, приложение вылетает, говоря, что

E/dalvikvm-heap( 7058): Out of memory on a 31961104-byte allocation.
E/AndroidRuntime( 7058): FATAL EXCEPTION: main
E/AndroidRuntime( 7058): java.lang.OutOfMemoryError
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389)
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:418)
E/AndroidRuntime( 7058): at com.tribal.pages.app.UploadPhoto$ShowCapturedImage.onPostExecute(UploadPhoto.java:442)
E/AndroidRuntime( 7058): at com.tribal.pages.app.UploadPhoto$ShowCapturedImage.onPostExecute(UploadPhoto.java:1)
E/AndroidRuntime( 7058): at android.os.AsyncTask.finish(AsyncTask.java:602)
E/AndroidRuntime( 7058): at android.os.AsyncTask.access$600(AsyncTask.java:156)
E/AndroidRuntime( 7058): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
E/AndroidRuntime( 7058): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 7058): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 7058): at android.app.ActivityThread.main(ActivityThread.java:4517)
E/AndroidRuntime( 7058): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 7058): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 7058): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
E/AndroidRuntime( 7058): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
E/AndroidRuntime( 7058): at dalvik.system.NativeStart.main(Native Method)
E/android.os.Debug( 2098): !@Dumpstate > dumpstate -k -t -n -z -d -o /data/log/dumpstate_app_error
E/widget  ( 2468): [MSC_HERO_Accu]>>> SM:399 [0:0] IR : false, IPR : false
E/Launcher( 2468): Error finding setting, default accessibility to not found: accessibility_enabled
E/widget  ( 2468): [MSC_HERO_Accu]>>> SM:399 [0:0] IR : false, IPR : false

Я попытался использовать следующие 2 метода для загрузки захваченного изображения или выбранного изображения в методе ImageView 1.

Bitmap  bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(Appconstants._uri));
                       bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
ImageView uplaod_image.setImageBitmap(bitmap);

Способ 2

Bitmap bitmap = BitmapFactory.decodeFile(Appconstants.f);
ImageView uplaod_image.setImageBitmap(bitmap);

Но каждый раз, когда приложение вылетает с ошибкой выше, как решить эту проблему....


person Siva K    schedule 19.10.2012    source источник
comment
вы имеете в виду размер - захваченные изображения имеют размер от 1,2 МБ до 1,7 МБ .....   -  person Siva K    schedule 19.10.2012


Ответы (2)


Разница, которую вы видите в поведении, вероятно, связана с разницей в размерах изображений на двух телефонах.

Возможно, вы захотите позвонить,

upload_image.setImageDrawable(null);

чтобы очистить изображение (или используйте один из способов, подробно описанных здесь), прежде чем пытаться загрузить другое изображение, чтобы эта память очищалась и собиралась сборщиком мусора перед последующим выделением и предотвращала ошибку Out of memory.

person Anirudh Ramanathan    schedule 19.10.2012

Попробуйте масштабировать изображение перед загрузкой в ​​память в соответствии с размером экрана устройства,

Вы можете использовать параметры BitmapFactory inJustDecodeBounds = true, чтобы получить размер растрового изображения перед его декодированием в память.

получить высоту и ширину,

int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

Затем вы можете масштабировать его с необходимой высотой и шириной изображения в соответствии с вашими требованиями,

int inSampleSize = Math.min(imageWidth /reqWidth,imageHeight /reqHeight);

И, наконец, примените inSampleSize для масштабирования растрового изображения. Дополнительные сведения см. в моем ответе здесь.

person Lalit Poptani    schedule 19.10.2012