2011-12-14 10 views
30

Necesito obtener Bitmap y sonido de los activos. Trato de hacerlo de esta manera:android get Bitmap o sonido de los activos

BitmapFactory.decodeFile("file:///android_asset/Files/Numbers/l1.png"); 

Y como esto:

getBitmapFromAsset("Files/Numbers/l1.png"); 
    private Bitmap getBitmapFromAsset(String strName) { 
     AssetManager assetManager = getAssets(); 
     InputStream istr = null; 
     try { 
      istr = assetManager.open(strName); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Bitmap bitmap = BitmapFactory.decodeStream(istr); 
     return bitmap; 
    } 

Pero consigo el espacio justo, libre, no la imagen.

¿Cómo hacer esto?

Respuesta

98
public static Bitmap getBitmapFromAsset(Context context, String filePath) { 
    AssetManager assetManager = context.getAssets(); 

    InputStream istr; 
    Bitmap bitmap = null; 
    try { 
     istr = assetManager.open(filePath); 
     bitmap = BitmapFactory.decodeStream(istr); 
    } catch (IOException e) { 
     // handle exception 
    } 

    return bitmap; 
} 

la ruta es simplemente su nombre de archivo fx bitmap.png. si utiliza mapa de bits subcarpeta/entonces su mapa de bits/bitmap.png

+0

Es la manera correcta. Pero veo solo espacio libre, no la imagen ... ¿qué hice mal? – Val

+0

Revise su imagen ... intente utilizar depuración y paso a paso. Proporcione más detalles, para dónde se coloca la imagen y cómo se llama. – Warpzit

+0

Recuerda la distinción entre mayúsculas y minúsculas si usas las subcarpetas – Warpzit

10

utilizar el código de su trabajo

try { 
    InputStream bitmap=getAssets().open("icon.png"); 
    Bitmap bit=BitmapFactory.decodeStream(bitmap); 
    img.setImageBitmap(bit); 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 

actualización

Mientras que la decodificación de mapa de bits que con mayor frecuencia encontramos con excepción de desbordamiento de memoria si Tamaño de imagen es muy grande. Así que leer el artículo How to display Image efficiently te ayudará.

6

La respuesta aceptada nunca cierra el InputStream. Aquí hay un método de utilidad para obtener un Bitmap en la carpeta de activos:

/** 
* Retrieve a bitmap from assets. 
* 
* @param mgr 
*   The {@link AssetManager} obtained via {@link Context#getAssets()} 
* @param path 
*   The path to the asset. 
* @return The {@link Bitmap} or {@code null} if we failed to decode the file. 
*/ 
public static Bitmap getBitmapFromAsset(AssetManager mgr, String path) { 
    InputStream is = null; 
    Bitmap bitmap = null; 
    try { 
     is = mgr.open(path); 
     bitmap = BitmapFactory.decodeStream(is); 
    } catch (final IOException e) { 
     bitmap = null; 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException ignored) { 
      } 
     } 
    } 
    return bitmap; 
} 
+0

¡Esta debería ser la respuesta aceptada! No desea cerrar una secuencia porque el tipo de excepción que podría obtener más adelante sería una excepción nativa, lo que significa que no podrá verla :( –

Cuestiones relacionadas