Bitmap devuelve null desde BitmapFactory.decodeFile (filename)

Cuando estoy llamando a esta función no hay imagen en la vista de imagen bitmapFactory.decodefile(filename) muestra nulo … ayuda por favor.

Aquí está mi código:

 public Bitmap ShowImage(String imageName,String userImageName ) { File sdcard_mainDirectory = new File(Environment.getExternalStorageDirectory(),"UserImages").getAbsoluteFile(); File file = new File(sdcard_mainDirectory, userImageName).getAbsoluteFile(); if (file != null) { try { String imageInSD = "/sdcard/UserImages/"+userImageName; Bitmap bitmap = BitmapFactory.decodeFile(imageInSD); return bitmap; } catch (Exception e) { e.printStackTrace(); } } return null; } 

Hola, es null porque puede ser que el tamaño de la imagen sea grande y obtenga una excepción, compruebe su registro y vea si hay algún error en el bitmap fuera de memoria si es así, entonces use las opciones para eso:

 BitmapFactory.Options options; try { String imageInSD = "/sdcard/UserImages/" + userImageName; Bitmap bitmap = BitmapFactory.decodeFile(imageInSD); return bitmap; } catch (OutOfMemoryError e) { try { options = new BitmapFactory.Options(); options.inSampleSize = 2; Bitmap bitmap = BitmapFactory.decodeFile(imageInSD, null, options); return bitmap; } catch(Exception excepetion) { Log.e(excepetion); } } 

¿Por qué haces esto String imageInSD = “/ sdcard / UserImages /” + userImageName;

Creo que si obtienes un archivo .png entonces solo,

  Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 

NOTA: También compruebe que tiene un archivo de imagen compatible con Android presente en esa ubicación.

Intente agregar permisos de acceso a la tarjeta SD READ_EXTERNAL_STORAGE y / o WRITE_EXTERNAL_STORAGE. Esto funciona para mi.

Es simple: su archivo no es una imagen o imagen que no es compatible con la implementación de bitmap de Android, o su ruta no es válida.


Consulte la documentación de BitmapFactory.decodeFile(String file) :

Devoluciones
el bitmap decodificado resultante, o nulo si no se pudo decodificar.


Por lo general, cuando el bitmap no se puede decodificar, algunos registros se imprimen en logcat. Inspeccione con cuidado.

Asegúrese de que en sus opciones (BitmapFactory.Options) InJustDecodeBounds esté configurado en falso o de lo contrario devolverá nulo. Esto se puede configurar como verdadero cuando solo desea que el archivo sea decodificado, pero no lo necesita más en su código. De esta forma, no es necesario asignar memoria adicional. Mira aquí para más explicaciones.

Estoy construyendo una aplicación de procesamiento de imágenes y también he devuelto un valor nulo al probar estos métodos. Mi consola no devolvió un error, sino una statement de degub como esta

D / skia: — decodificador-> deencoding devuelto falso

Esto es lo que encontré que hará que cualquier bitmap se cargue a través de mi aplicación

1) corregir el nombre del archivo con los permisos apropiados

2) Escale la imagen cuando sea apropiado

3) Si necesita una imagen grande, configúrelo debajo de su manifiesto como tal

   

Usar un montón grande no es un sustituto para mostrar el tamaño de imagen correcto. Aquí hay un ejemplo del código que uso directamente de androids docs

  public Bitmap getRawImageThumb(Context mContext) { Bitmap b = null; int reqHeight = 100, reqWidth = 100; String filename = mContext.getFilesDir().toString() + "/" + rawFileName; Log.d(TAG, "processRawReceipt: " + rawFileName); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //options.inPreferredConfig = Bitmap.Config.ARGB_8888; BitmapFactory.decodeFile(filename, options); int height = options.outHeight; int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } options.inSampleSize = inSampleSize; options.inJustDecodeBounds = false; Log.d(TAG, "getRawImage: " + String.valueOf(height) + " " + String.valueOf(width) + " " + String.valueOf(inSampleSize)); b = BitmapFactory.decodeFile(filename, options); return b; } 

Me faltaba la verificación de permiso de tiempo de ejecución en el nivel de API superior a 16.

BitmapFactory.decodeFile() ejecuta antes de colocar toda la imagen en esa ruta exacta. Cuando decodeFile() ejecuta no hay imagen. Entonces, el bitmap devuelve null . En general, las imágenes de alto píxel tardan algo de tiempo en colocarse en su camino. Entonces esta excepción sucede.

Por favor, compruebe el nulo e intente descodificar el archivo.

 Bitmap bitmap = null; while(bitmap == null) bitmap = BitmapFactory.decodeFile(imageInSD); 

Quizás el bitmap aún no está listo en esa ruta. Puede agregar algo de retraso al código. Por ejemplo:

 Bitmap bitmap = BitmapFactory.decodeFile(imageInSD); if (bitmap == null) { Thread.sleep(1000); //delay 1 second bitmap = BitmapFactory.decodeFile(imageInSD); } if (bitmap == null) { Thread.sleep(3000); //add another 3 seconds delay bitmap = BitmapFactory.decodeFile(imageInSD); } if (bitmap == null) { Thread.sleep(5000); //add another 5 seconds delay bitmap = BitmapFactory.decodeFile(imageInSD); } 

de esa manera puede asegurarse de que el bitmap esté listo.