You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中无法调用assets.open读取assets目录下CSV文件的问题求助

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解析了

另外要确认的几个基础点

  1. assets文件夹的位置必须正确
    必须是在app/src/main目录下,和javares文件夹同级的assets文件夹,不能随便建在别的地方!比如正确路径是app/src/main/assets,把你的CSV文件直接丢这里(如果有子目录的话,路径要对应,比如assets/trivia/xxx.csv,那open的时候就要写trivia/xxx.csv)。
    写完之后记得点一下Android Studio右上角的「Sync Project with Gradle Files」按钮,确保文件被项目识别到。

  2. 关于你之前试的getResources()报错
    同样的道理,getResources()也是Context的方法,普通函数里直接写肯定找不到,必须通过Context调用:context.resources

  3. 如果是在Fragment里调用的话
    别直接传this,要用requireContext()来获取Fragment关联的Activity上下文:

    val triviaInputStream = loadTriviaFile(requireContext(), "myTrivia.csv")
    

再给你补个当年和现在的小差异

15年前咱们写代码可能全堆在Activity里,所以Context是默认就有的,现在提倡代码分层、抽离工具函数,就必须手动传递Context了——这就是教程没讲透的那个“基础常识”,咱们老炮儿刚回来确实容易踩这个坑。

现在你先按这个方法把Context传进去,应该就能正常调用assets.open()拿到文件流了,解析的部分你说自己能搞定,那接下来应该就顺了!

内容来源于stack exchange

火山引擎 最新活动