Android中无法调用assets.open读取assets目录下CSV文件的问题求助
老哥我太懂这种时隔15年捡Android开发,突然被基础问题卡壳的憋屈感了!当年全手写代码的老炮儿,现在碰新版Android Studio,确实容易被一些“默认常识”卡到——教程总觉得这些是基础中的基础,反而跳过去了,咱们来一步步捋清楚:
核心问题:你缺了「上下文(Context)」的传递
assets这个对象不是凭空就能用的,它是Context的成员属性——只有在有Context的环境里(比如Activity、Service)才能直接调用assets.open(...),但如果你想把文件加载写成独立函数,这个普通函数本身是没有上下文的,所以必须手动把Context传进去!
比如你想写一个能传不同文件名的独立加载函数,应该这么写:
// 独立的 trivia 文件加载函数,必须传入Context参数 fun loadTriviaFile(context: Context, fileName: String): InputStream { // 这里通过传入的Context拿到assets对象,再调用open方法 return context.assets.open(fileName) }
然后在你的Activity里调用的时候,直接传this就行(因为Activity本身就是Context的子类):
// 比如在MainActivity的某个方法里调用 val triviaInputStream = loadTriviaFile(this, "myTrivia.csv") // 接下来就可以用这个inputStream去做CSV解析了
另外要确认的几个基础点
assets文件夹的位置必须正确
必须是在app/src/main目录下,和java、res文件夹同级的assets文件夹,不能随便建在别的地方!比如正确路径是app/src/main/assets,把你的CSV文件直接丢这里(如果有子目录的话,路径要对应,比如assets/trivia/xxx.csv,那open的时候就要写trivia/xxx.csv)。
写完之后记得点一下Android Studio右上角的「Sync Project with Gradle Files」按钮,确保文件被项目识别到。关于你之前试的getResources()报错
同样的道理,getResources()也是Context的方法,普通函数里直接写肯定找不到,必须通过Context调用:context.resources。如果是在Fragment里调用的话
别直接传this,要用requireContext()来获取Fragment关联的Activity上下文:val triviaInputStream = loadTriviaFile(requireContext(), "myTrivia.csv")
再给你补个当年和现在的小差异
15年前咱们写代码可能全堆在Activity里,所以Context是默认就有的,现在提倡代码分层、抽离工具函数,就必须手动传递Context了——这就是教程没讲透的那个“基础常识”,咱们老炮儿刚回来确实容易踩这个坑。
现在你先按这个方法把Context传进去,应该就能正常调用assets.open()拿到文件流了,解析的部分你说自己能搞定,那接下来应该就顺了!
内容来源于stack exchange




