首页 > 解决方案 > 写入文件 (ByteArray) 并返回 Uri 时出现空对象引用错误

问题描述

我编写了这个函数来保存文件并返回文件 Uri. 但是根目录文件变量总是空的,所以最后会抛出一个 NPE。

fun writeFile(context: Context, fileName: String, body: ByteArray): Uri? {
        val fname = "${Environment.getExternalStorageDirectory().absolutePath}/ardata"
        val root = File(fname)
        if (!root.exists()) {
            root.mkdirs()
        }

        try {
            val file = File(root, fileName)
            file.writeBytes(body)
            file.setExecutable(true)
            return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return null
    }

返回会抛出一个带有以下消息的 NPE :

尝试在空对象引用上调用虚拟方法 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'

这就是我的变量在函数末尾的样子

变量

如何保存文件(ByteArray)并返回 Uri?

标签: androidkotlinstorage

解决方案


我将返回更改为 Uri.parse 并工作

    val fname = "${Environment.getExternalStorageDirectory().absolutePath}/ardata"
    val root = File(fname)
    if (!root.exists()) {
        root.mkdirs()
    }

    try {
        val file = File(root, fileName)
        file.writeBytes(body)
        file.setExecutable(true)
        val obj = file.path
        return Uri.parse(obj)
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return null

推荐阅读