一、Android读取Assets中图片并显示
private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; AssetManager am = getResources().getAssets(); if (am == null) { return null; } try { InputStream is = am.open(fileName); image = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; }
首先是获取AssetManager,然后调用其函数open,打开对应的资源文件
二、open函数追朔(Java层)
public final InputStream open(String fileName) throws IOException { return open(fileName, ACCESS_STREAMING); //ACCESS_STREAMING = 2 }
open—>
public final InputStream open(String fileName, int accessMode) throws IOException { synchronized (this) { if (!mOpen) { throw new RuntimeException("Assetmanager has been closed"); } long asset = openAsset(fileName, accessMode); if (asset != 0) { AssetInputStream res = new AssetInputStream(asset); incRefsLocked(res.hashCode()); return res; } } throw new FileNotFoundException("Asset file: " + fileName); }
openAsset–>
private native final long openAsset(String fileName, int accessMode);
三、openAsset函数追朔(Native层)
static jlong android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz,jstring fileName, jint mode) { AssetManager* am = assetManagerForJavaObject(env, clazz); if (am == NULL) { return 0; } ALOGV("openAsset in %p (Java object %p)\n", am, clazz); ScopedUtfChars fileName8(env, fileName); if (fileName8.c_str() == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", "Empty file name"); return -1; } if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) { jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode"); return -1; } Asset* a = am->open(fileName8.c_str(), (Asset::AccessMode)mode); if (a == NULL) { jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); return -1; } //printf("Created Asset Stream: %p\n", a); return reinterpret_cast(a); }
完整请移步 http://www.tasfa.cn/index.php/2017/09/22/android-assets_sourcecode/