2011-12-14 14 views
30

Potrzebuję uzyskać bitmapy i dźwięk z aktywów. Staram się robić to tak:Android uzyskać Bitmap lub dźwięk z aktywów

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

I tak:

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; 
    } 

Ale mam tylko wolną przestrzeń, a nie obrazu.

Jak to zrobić?

Odpowiedz

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; 
} 

ścieżka jest po prostu nazwą pliku fx bitmap.png. jeśli używasz podfolder bitmapę/to jego bitmapy/bitmap.png

+0

To jest właściwa droga. Ale widzę tylko wolną przestrzeń, a nie obraz ... co zrobiłem źle? – Val

+0

Sprawdź swoje zdjęcie ... spróbuj użyć debugowania i wykonaj krok. Podaj więcej szczegółów, gdzie umieścisz zdjęcie i jak się nazywa. – Warpzit

+0

Zapamiętajcie wielkość liter, jeśli korzystacie z podfolderów – Warpzit

10

użyć tego kodu jego pracy

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(); 
} 

Aktualizacja

Podczas dekodowania bitmapę możemy coraz częściej spotkać się z wyjątku przepełnienia pamięci, jeśli rozmiar obrazu jest bardzo duży. Czyli przeczytanie artykułu How to display Image efficiently pomoże.

6

Przyjęta odpowiedź nigdy nie zamyka się na InputStream. Oto metoda narzędzia do uzyskania Bitmap w folderze zasobów:

/** 
* 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

To powinna być zaakceptowana odpowiedź! Nie chcesz nie zamykać strumienia, ponieważ wyjątek, który możesz otrzymać później, będzie rodzimym wyjątkiem, co oznacza, że ​​nie będziesz w stanie go przechwycić :( –

Powiązane problemy