kotlin 如何在测试时写入Android模拟器上的内部持久存储?

s3fp2yjn  于 2023-06-30  发布在  Kotlin
关注(0)|答案(1)|浏览(115)

我目前正在一个模拟器上用一个测试应用程序运行JUnit测试,该模拟器正在运行我的目标应用程序并验证结果。在这些测试的运行时,我有一些特定的文件,我想保存到测试应用程序的内部持久存储中,如Android文档的这一部分所述。
文档的这一部分指出

Your app doesn't require any system permissions to read and write to files in these directories.

然而,每当我试图按照文档创建文件时,我发现我没有在该区域读取或写入文件的权限。
我尝试过以下方法。我已经在JUnit规则的after方法中运行了这些命令,这些命令在测试APK中执行,而不是在目标APK中执行。
首先,我尝试按照文档中的说明,使用

val f = File(context.filesDir, "tmp.txt")

然而,f.canRead()f.canWrite()都返回false,这表明我实际上没有读/写这个特定文件的权限,尽管我上面链接的Android文档中有说明。
另外,我尝试过不顾这些信号继续写数据,执行f.createNewFile()时抛出"java.io.IOException: No such file or directory"异常。此外,f.parentFile.mkdirs()似乎也失败了,返回了false。最后,我尝试构造一个FileOutputStream(f),它抛出一个java.io.FileNotFoundException,原因是"android.system.ErrnoException: open failed: ENOENT (No such file or directory)"
我不太清楚为什么我在保存文件时会遇到这样的问题,尤其是当文档中说我不需要关心应用程序的权限时;然而,如果任何人遇到任何类似的问题或有任何建议,将不胜感激。谢谢!

编辑:

文档指出,持久的内部文件应该位于通过适当的context对象上的filesDir属性获得的目录中。因此,由于我正在执行插装测试,并希望将这些文件保存在测试APK中,因此我通过

val context = InstrumentationRegistry.getInstrumentation().context

,然后,我使用context.filesDir属性来确定将文件放置在哪个目录下。
另外,我尝试通过f.createNewFile()创建文件,也返回false

wgmfuz8q

wgmfuz8q1#

在yout AndroidManifest中添加这一行

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

相关问题