Android Kotlin:使用Volley从API下载并转换Excel文件的问题
解决Volley下载Excel文件并转换为本地文件的问题
你的问题出在使用了StringRequest处理二进制文件(Excel本质是ZIP压缩包,以PK开头),StringRequest会将二进制数据当作字符串解码,导致数据损坏。正确的做法是使用二进制请求获取原始字节数组,再写入文件。
步骤1:自定义Volley二进制请求
Volley没有内置的ByteArrayRequest,需要自己实现:
class ByteArrayRequest( method: Int, url: String, private val listener: Response.Listener<ByteArray>, errorListener: Response.ErrorListener ) : Request<ByteArray>(method, url, errorListener) { override fun deliverResponse(response: ByteArray) { listener.onResponse(response) } override fun parseNetworkResponse(response: NetworkResponse?): Response<ByteArray> { return Response.success( response?.data, HttpHeaderParser.parseCacheHeaders(response) ) } }
步骤2:使用二进制请求获取Excel数据
替换原来的StringRequest为上面的ByteArrayRequest:
val url = "你的API地址" val byteArrayReq = ByteArrayRequest( Method.GET, url, Response.Listener { byteArray -> hidePregressBar() // 将字节数组保存为Excel文件 saveByteArrayToExcel(byteArray) }, Response.ErrorListener { error -> hidePregressBar() // 处理错误逻辑 } ) // 添加请求到Volley队列 Volley.newRequestQueue(this).add(byteArrayReq)
步骤3:实现字节数组转Excel文件的方法
将获取到的byte数组写入本地文件,注意处理存储规则:
private fun saveByteArrayToExcel(byteArray: ByteArray) { try { // 选择存储路径,比如App专属外部存储的Download目录 val downloadDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) val excelFile = File(downloadDir, "downloaded_excel.xlsx") // 写入字节数组到文件 FileOutputStream(excelFile).use { outputStream -> outputStream.write(byteArray) outputStream.flush() } // 通知系统刷新媒体库,让文件能在文件管理器中被找到 MediaScannerConnection.scanFile( this, arrayOf(excelFile.absolutePath), null, null ) } catch (e: Exception) { e.printStackTrace() } }
注意事项
- 权限适配:Android 10(API 29)及以上版本,使用
getExternalFilesDir不需要动态申请存储权限;更低版本需在Manifest中添加WRITE_EXTERNAL_STORAGE权限并动态申请。 - 文件格式匹配:确认API返回的是
.xlsx还是.xls,文件名后缀要对应,避免文件无法正常打开。
内容的提问来源于stack exchange,提问作者Ajay gadadasu
相关产品推荐
相关产品推荐

