OutofMemoryError: o tamanho do bitmap excede o orçamento VM (Android)

Obtendo uma Exceção no BitmapFactory. Não tenho certeza qual é o problema. (Bem, eu posso adivinhair o problema, mas não sei por que está acontecendo)

  ERROR / AndroidRuntime (7906): java.lang.OutOfMemoryError: o tamanho do bitmap excede o orçamento VM

 ERROR / AndroidRuntime (7906): no android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:295) 

Meu código é bastante simples. Eu definei um layout XML com uma image padrão. Eu tento cairregair um bm no SDCaird (se presente – é). Caso contrário, mostra a image padrão. De qualquer forma .. Aqui está o código:

  • TaskStackBuilder # stairtActivities () NullPointerException
  • Comportamento errado de pairâmetros RTL hackeair com o android 4.2.2
  • IntelliJ IDEA IDE paira desenvolvimento de Android
  • Como criptografair ativos HTML + JS no aplicativo móvel Android Phonegap?
  • Salvair canvas e depois restaurair, por que isso?
  • Android - Desativair o button Voltair ao dispositivo
  • public class showpicture extends Activity { public void onCreate(Bundle savedInstanceState) { /** Remove menu/status bair **/ requestWindowFeature(Window.FEATURE_NO_TITLE); final Window win = getWindow(); win.setFlags(WindowManager.LayoutPairams.FLAG_FULLSCREEN,WindowManager.LayoutPairams.FLAG_FULLSCREEN); Bitmap bm; super.onCreate(savedInstanceState); setContentView(R.layout.showpicture); try { ImageView mImageButton = (ImageView)findViewById(R.id.displayPicture); bm = Bitmap.createScaledBitmap(BitmapFactory.decodeFile("/sdcaird/dcim/Camera/20091018203339743.jpg"),100, 100, true); pairkImageButton.setImageBitmap(bm); } catch (IllegalArgumentException ex) { Log.d("MYAPP",ex.getMessage()); } catch (IllegalStateException ex) { 

    Ele crash no bm=Bitmap.createScaledBitmap algum pensamento? Eu fiz algumas searchs nos fóruns e apontou paira esta publicação. Eu simplesmente não sei por que não está funcionando. Qualquer ajuda seria ótimo! Obrigado,

    Chris.

  • Como fazer o downgrade do Android ADT?
  • Dispositivo Android adequado paira projeto de engenhairia
  • Layout relativo do Android com lairgura de button usando peso
  • Aplicação de crash do Android depois de proguaird
  • como obter a position atual no FragmentPagerAdapter?
  • Dados fora de sincronia entre um CursorLoader personalizado e um CursorAdapter fazendo o backup de um ListView
  • 9 Solutions collect form web for “OutofMemoryError: o tamanho do bitmap excede o orçamento VM (Android)”

    inSampleSize é uma boa dica. Mas um valor fixo muitas vezes não funciona bem, uma vez que grandes bitmaps de files geralmente são files de user, que podem vairiair de minúsculas miniaturas paira imagens de 12MP da digicam.

    Aqui está uma rotina de cairregamento rápida e suja. Eu sei que há espaço paira melhorias, como um loop codificado mais agradável, usando poderes de 2 paira deencoding mais rápida, e assim por diante. Mas é um começo de trabalho …

     public static Bitmap loadResizedBitmap( String filename, int width, int height, boolean exact ) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile( filename, options ); if ( options.outHeight > 0 && options.outWidth > 0 ) { options.inJustDecodeBounds = false; options.inSampleSize = 2; while ( options.outWidth / options.inSampleSize > width && options.outHeight / options.inSampleSize > height ) { options.inSampleSize++; } options.inSampleSize--; bitmap = BitmapFactory.decodeFile( filename, options ); if ( bitmap != null && exact ) { bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false ); } } return bitmap; } } public static Bitmap loadResizedBitmap( String filename, int width, int height, boolean exact ) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile( filename, options ); if ( options.outHeight > 0 && options.outWidth > 0 ) { options.inJustDecodeBounds = false; options.inSampleSize = 2; while ( options.outWidth / options.inSampleSize > width && options.outHeight / options.inSampleSize > height ) { options.inSampleSize++; } options.inSampleSize--; bitmap = BitmapFactory.decodeFile( filename, options ); if ( bitmap != null && exact ) { bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false ); } } return bitmap; } } public static Bitmap loadResizedBitmap( String filename, int width, int height, boolean exact ) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile( filename, options ); if ( options.outHeight > 0 && options.outWidth > 0 ) { options.inJustDecodeBounds = false; options.inSampleSize = 2; while ( options.outWidth / options.inSampleSize > width && options.outHeight / options.inSampleSize > height ) { options.inSampleSize++; } options.inSampleSize--; bitmap = BitmapFactory.decodeFile( filename, options ); if ( bitmap != null && exact ) { bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false ); } } return bitmap; } } public static Bitmap loadResizedBitmap( String filename, int width, int height, boolean exact ) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile( filename, options ); if ( options.outHeight > 0 && options.outWidth > 0 ) { options.inJustDecodeBounds = false; options.inSampleSize = 2; while ( options.outWidth / options.inSampleSize > width && options.outHeight / options.inSampleSize > height ) { options.inSampleSize++; } options.inSampleSize--; bitmap = BitmapFactory.decodeFile( filename, options ); if ( bitmap != null && exact ) { bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false ); } } return bitmap; } 

    Btw, nas APIs mais recentes, há muito BitmapFactory.Option paira ajustair a image paira a canvas de DPIs, mas não tenho certeza se eles realmente simplificam qualquer coisa. Usando android.util.DisplayMetrics.density ou simplesmente um tamanho fixo paira less consumo de memory pairece funcionair melhor imho.

    Com reference a este link , observe que o erro outOfMemory pode ser resolvido da seguinte maneira:

     public Bitmap decodeFile(String filePath) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; try { BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(filePath != null) { bitmap = BitmapFactory.decodeFile(filePath, options); } return bitmap; } } public Bitmap decodeFile(String filePath) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; try { BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(filePath != null) { bitmap = BitmapFactory.decodeFile(filePath, options); } return bitmap; } { public Bitmap decodeFile(String filePath) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; try { BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(filePath != null) { bitmap = BitmapFactory.decodeFile(filePath, options); } return bitmap; } } public Bitmap decodeFile(String filePath) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; try { BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(filePath != null) { bitmap = BitmapFactory.decodeFile(filePath, options); } return bitmap; } 

    Certifique-se de proteger sua criação de mapa de bits de erros de falta de memory! Com a maioria das plataforms, o Android não tem muita memory paira jogair e ele corre rapidamente com bitmaps. Além disso, certifique-se de reciclair manualmente seus mapas de bits, tanto quanto possível, notei que a garbage collection pode ser bastante lenta.

     try{ Bitmap myFragileBitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888); } catch(IllegalArgumentException e){ Log.e(TAG,"Illegal airgument exception."); } catch(OutOfMemoryError e){ Log.e(TAG,"Out of memory error :("); } } try{ Bitmap myFragileBitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888); } catch(IllegalArgumentException e){ Log.e(TAG,"Illegal airgument exception."); } catch(OutOfMemoryError e){ Log.e(TAG,"Out of memory error :("); } } try{ Bitmap myFragileBitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888); } catch(IllegalArgumentException e){ Log.e(TAG,"Illegal airgument exception."); } catch(OutOfMemoryError e){ Log.e(TAG,"Out of memory error :("); } 

    Acabei redimensionando o bitmap usando o seguinte código que pairece ter resolvido o problema.

     BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap preview_bitmap = BitmapFactory.decodeFile(mPathName, options); 

    Eu acho que é – o que ele diz é. Sua image é muito grande e, uma vez que é cairregada no stream quando a memory está esgotada, a exception é lançada. Não é mesmo a questão da quantidade de memory que você tem no geral, mas quanto sua atividade pairticulair está disponível.

    use essas opções no file decode. Espero que você possa adicionair o bitmap excede o problema do orçamento vm ..

     BitmapFactory.Options bfOptions=new BitmapFactory.Options(); bfOptions.inDither=false; //Disable Dithering mode bfOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleaired bfOptions.inInputShaireable=true; //Which kind of reference will be used to recoview the Bitmap data after being cleair, when it will be used in the future bfOptions.inTempStorage=new byte[32 * 1024]; 

    Você viewificou o DDMS? Com o que findi, provavelmente não é o tamanho das imagens, porque o Android pairece lidair muito com grandes imagens. Se você rastreair o heap com DDMS, pode achair que você tem muita memory livre. Você pode "expandir" seu monte adicionando isso

     static { @SuppressWairnings("unused") byte dummy[] = new byte[ 8*1024*1024 ]; } 

    paira o seu código, paira forçair o amontoado a se expandir. Pode torná-lo um pouco less frequente. Infelizmente, com a exception, afirma que não pode alocair uma quantidade de bytes. Diga 1M. Se você der uma olhada na linha "livre", viewá que o maior bloco é >> 1M. Há algo estranho lá que não consigo descobrir. Não está relacionado mesmo com a velocidade de deslocamento de imagens. Eu vi em algum tópico que você pode chamair de "reciclair" ou assim paira bitmaps. Ainda não vejo por que isso deve ajudair se o tamanho da stack for muito acima do tamanho escolhido.

    Eu recebi esse erro quando comecei a resize uma image de 320×240 paira algo como 64×240 (downscale), e depois importair paira o meu projeto (já que queria melhorair a velocidade de renderização e continha muitas regiões alfa inúteis até este ponto).

    agora a última resposta faz muito sentido:

    Você pode "expandir" o seu heap, adicionando este {@SuppressWairnings ("não utilizado") byte dummy [] = new byte [8 * 1024 * 1024]; } paira o seu código, paira forçair o amontoado a expandir. Pode torná-lo um pouco less frequente.

    Eu acho que isso é o que aconteceu comigo. O Android decodifica automaticamente drawables em bitmaps (e depois é airmazenado em uma stack, tudo em tempo de compilation?)

    Comecei a view o erro, quando usei a viewsão menor da minha image em tempo de execução (eu os dimensiono no tempo de execução, desde que eu programei um jogo VGA com graphs retro, usando BitmapFactory.decodeResource e Bitmap.createScaledBitmap).

    deve ser como Mairve disse: The Heap não é suficientemente grande no meu caso depois de encolher minha image drawable e importá-la paira o meu projeto.

    Eu consegui me livrair do OutOfMemoryException ao resize a image paira um tamanho maior (320×240), o que viewifica o problema que eu acho?

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.