When developing Android apps using Kotlin, one of the common issues developers encounter is the error “Cannot load asset from assets folder”. This usually happens when your application tries to read a file (JSON, images, text, fonts, etc.) located inside the assets
directory but fails to locate or open it. This article provides an in-depth explanation of why this error happens, how to solve it, and practical code examples you can directly use in Android Studio.

Understanding the Assets Folder in Android
The assets
folder is a special directory inside your Android project that allows you to store raw files. Unlike the res
directory, files in assets
are not given an ID in the R
class. Instead, they must be accessed programmatically using AssetManager
. Typical use cases include loading JSON configurations, custom fonts, HTML files, and other resources your application needs at runtime.
Common Causes of the Error
- Incorrect file path: Attempting to load a file using the wrong relative path.
- File not placed in the correct directory: The file might be in
res/raw
instead ofassets
. - Case sensitivity: Android file systems are case-sensitive.
data.json
is not the same asData.json
. - Missing or deleted asset file: The file may not exist in the project folder at all.
- Accessing assets before initialization: Trying to load assets before the app context is ready.
Example: Loading JSON from Assets
Suppose we want to load a JSON file named sample.json
stored in the app/src/main/assets/
folder. Here’s a common way to do it:
fun loadJSONFromAssets(context: Context, fileName: String): String? { return try { val inputStream = context.assets.open(fileName) val size = inputStream.available() val buffer = ByteArray(size) inputStream.read(buffer) inputStream.close() String(buffer, Charsets.UTF_8) } catch (ex: IOException) { ex.printStackTrace() null } }
You can then call this function inside an Activity
or Fragment
:
val jsonString = loadJSONFromAssets(this, "sample.json") if (jsonString != null) { Log.d("AssetsExample", "Loaded JSON: $jsonString") } else { Log.e("AssetsExample", "Failed to load JSON file") }
Example: Loading an Image from Assets
Loading images from assets
is slightly different. You must decode the InputStream into a Bitmap
:
fun loadBitmapFromAssets(context: Context, fileName: String): Bitmap? { return try { val inputStream = context.assets.open(fileName) val bitmap = BitmapFactory.decodeStream(inputStream) inputStream.close() bitmap } catch (e: IOException) { e.printStackTrace() null } }
Usage in an ImageView
:
val imageView: ImageView = findViewById(R.id.myImageView) val bitmap = loadBitmapFromAssets(this, "images/logo.png") bitmap?.let { imageView.setImageBitmap(it) }
Example: Loading HTML File into WebView
Another popular use case is loading local HTML into a WebView
:
val webView: WebView = findViewById(R.id.webView) webView.settings.javaScriptEnabled = true webView.loadUrl("file:///android_asset/index.html")
Notice the path format: file:///android_asset/
is required when using WebView
.
Troubleshooting Checklist
If you still face the Kotlin cannot load asset from assets folder error, check the following:
- Verify that the
assets
folder is located insideapp/src/main/
. - Ensure the file name and path are correct, respecting case sensitivity.
- Check if the file is included in your APK. You can use
Analyze APK
in Android Studio. - Use
try-catch
blocks to capture and debug errors. - Test with small sample files to confirm your function works correctly.
Comparison: Assets vs Raw Folder
Many beginners confuse assets
with raw
. The table below highlights the differences:
Feature | Assets Folder | Raw Folder |
---|---|---|
Location | app/src/main/assets/ | app/src/main/res/raw/ |
Access Method | AssetManager (e.g., context.assets.open() ) | Resources (e.g., resources.openRawResource() ) |
Generates R.java ID? | No | Yes |
Use Case | JSON, HTML, fonts, dynamic files | Audio, video, predefined resources |
Best Practices
- Keep your
assets
folder organized by using subfolders likeimages/
,json/
, orfonts/
. - Use
try-catch
to prevent crashes when a file is missing. - Minimize asset size to reduce APK size.
- Use caching when loading large assets to improve performance.
Conclusion
The error “Kotlin Cannot Load Asset from Assets Folder” is usually caused by incorrect file paths, missing files, or case sensitivity issues. By correctly using AssetManager
and verifying your project structure, you can easily load JSON, images, or HTML files from the assets
directory. Following the best practices and troubleshooting steps above will ensure smooth asset loading in your Kotlin Android projects.
For further reading on Android’s file handling, you can visit the official Android Developer Documentation.