android - 写入文件 (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?
解决方案
我将返回更改为 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
推荐阅读
- mongodb - 通过 mongodb vs 授权令牌中的字段授权资源(例如图像)访问?
- firebase - 多次上传 Vue / firebase 时出错(未定义或空引用)
- stripe-payments - 如果您不使用 Stripe Elements,如何调用 Stripe.createPaymentMethod?
- reactjs - 如何使用 useReducer 更新对象内的数组
- beautifulsoup - 如何通过BeautifulSoup通过IP地址扫描绕过非html IP
- javascript - javascript - 在文本框上传递值
- php - 从具有相同列名mysql的两个表中选择
- c++ - 模板而不是接口的缺点是什么?(C++)
- node.js - "message": "无法读取未定义的属性 'query'",
- c++ - 来自 libm 和 libstdc++ 的重复符号