Cargar imagen grande del servidor en Android

Estoy intentando exhibir un archivo del jpg de un servidor en un imageView. Cuando intento cargar una imagen más pequeña (300×400), no hay problemas. Pero cuando intento cargar una imagen a tamaño completo (2336×3504), la imagen no se cargará. El tamaño del archivo de la imagen es de sólo 2mb. No obtengo ningún error en logcat y no hay excepciones lanzadas. Simplemente no cargará la imagen. También intenté usar esto:

BitmapFactory.Options options=new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options); 

Esto no hace nada para ayudar a cargar los archivos grandes, pero sí cambia el tamaño de la imagen más pequeña (como se supone). Hice agregar la imagen grande a mis recursos y la probé como si estuviera incrustada en la aplicación y funcionó bien, apenas no trabajará en el servidor. He estado trabajando todo el día en esto y no puedo entender cómo cargar estas imágenes grandes. ¿Puede alguien ayudarme con esto? Gracias por cualquier información.

Aquí está el acoplamiento donde encontré el código antedicho y he estado jugando con los otros ejemplos pero todavía no conseguirlo para trabajar.

EDITAR:

Aquí está el código que estoy usando, para cargar la imagen:

 public static Bitmap getBitmapFromURL(String src) { Bitmap bmImg; URL myFileUrl = null; try { myFileUrl = new URL(src); HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); BitmapFactory.Options options=new BitmapFactory.Options(); options.inSampleSize = 16; bmImg = BitmapFactory.decodeStream(is, null, options); return bmImg; } catch (Exception e) { // TODO Auto-generated catch block Log.d("Error", e.toString()); return null; } } 

Aquí está la captura de pantalla logcat (no pude averiguar cómo copiar el texto apropiadamente en eclipse) Limpié el registro justo antes de pulsar el botón para cargar la imagen. Así que todo lo que ves es lo que sucede cuando golpeo ese botón. Borré los nombres de la compañía y de la aplicación (donde se ve "com.", Asume su "com.mycompany.myapp". Logcat Captura de pantalla

No es raro que BitmapFactory.decodeFromStream() renuncie y devuelva null cuando lo conecta directamente al InputStream de una conexión remota. Internamente, si no proporcionó un BufferedInputStream al método, envolverá el flujo suministrado en uno con un tamaño de búfer de 16384. Una opción que a veces funciona es pasar un BufferedInputStream con un tamaño de búfer más grande como:

 BufferedInputStream bis = new BufferedInputStream(is, 32 * 1024); 

Un método más universalmente eficaz es descargar el archivo primero y luego decodificar los datos de la siguiente manera:

 InputStream is = connection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is, 8190); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte)current); } byte[] imageData = baf.toByteArray(); BitmapFactory.decodeByteArray(imageData, 0, imageData.length); 

FYI, los tamaños de búfer en este ejemplo son algo arbitrarios. Como se ha dicho en otras respuestas, es una fantástica idea no mantener una imagen de ese tamaño en la memoria más de lo necesario. Podría considerar escribirlo directamente en un archivo y mostrar una versión reducida.

¡Espero que ayude!

La respuesta de Devunwired es correcta, pero se puede producir un error de memoria si el tamaño de la imagen es demasiado grande, en ese caso tendremos que bajar la imagen, aquí está el código para reducir la imagen después del código de la imagen de descarga de DevunWired

  final BitmapFactory.Options options = new BitmapFactory.Options(); BufferedInputStream bis = new BufferedInputStream(is, 4*1024); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte)current); } byte[] imageData = baf.toByteArray(); BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); options.inJustDecodeBounds = true; options.inSampleSize = 2; //calculateInSampleSize(options, 128, 128); options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); 

¿Cae en silencio o lanza una excepción o un error de OutOfMemory? Por cierto, si un jpeg es 2MB que no significa que va a ocupar 2MB de memoria. 2MB es el tamaño comprimido, y ya que Android está trabajando con un mapa de bits, el 2336 x 3504 ocupará aproximadamente 2336 x 3504 x 4 bytes en memoria. (2336 x 3504 x 4 = 32.741.376). El downsampling 8 veces todavía podría no ser suficiente, especialmente si tiene otros mapas de bits en la memoria en ese momento.

  • Android obtiene la posición del mapa de bits en ImageView
  • Cómo hacer que una imagen encaje en un marco circular en android
  • Android: gira la imagen en ImageView por 90degrees pero sin demora
  • Mapa de bits de Android para Imageview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.