通常情况下,我的任务是从选择的文件中获取base64。为了打开文件浏览器,我调用以下函数:
Original Answer翻译成"最初的回答"
private fun showFileBrowser() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.setType("*/*")
startActivityForResult(intent, FILE_CHOOSE_REQUEST_CODE)
}
它已成功打开。选择文件后,将调用
onActivityResult
。以下是代码:最初的回答:成功打开。当选择某个文件时,将调用
onActivityResult
。以下是代码:override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == FILE_CHOOSE_REQUEST_CODE) {
// not that data.data is Uri
if(data != null && data.data != null) {
val encodedBase64 = getBase64FromPath(data.data.path)
print(encodedBase64)
}
}
}
这是我将
文件
转换为base64的方法: private fun getBase64FromPath(path: String): String {
try {
val bytes = File(path).readBytes()
return Base64.encodeToString(bytes, Base64.DEFAULT)
} catch (error: IOException) {
error.printStackTrace() // This exception always occurs
}
}
看起来我做的一切都是正确的,但是我得到了FileNotFoundException
。我不知道这是什么原因。我没有添加任何权限,因为我不想写任何东西到scared,我只想让用户选择一个文件,然后将其转换为base64并发送到服务器。那么,我的代码有什么问题呢?
最初的回答:
您需要添加读取文件的权限,否则您将无法访问用户选择的文件。在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Uri
不是文件。ContentResolver
及其openInputStream()
方法可以处理file
和content
类型的Uri
值,而你有一个content
类型的Uri
。 - CommonsWare