Android技术问题:如何通过Intent获取文档转字节数组及上传Drive PDF至服务器
嘿,我来帮你搞定这个问题!你已经成功唤起了文件选择器,接下来在onActivityResult里的处理其实很清晰,分两步走就行:先拿到选中PDF的Uri,再把它转换成字节数组,这样就能轻松传给服务器接口了。
第一步:在
onActivityResult中获取PDF的Uri 首先要先判断请求码和结果是否符合预期,再从返回的Intent里提取文件的Uri。代码示例如下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 验证请求码、结果码,确保数据不为空 if (requestCode == Uploader.PDF && resultCode == RESULT_OK && data != null) { // 获取选中PDF的内容Uri Uri pdfUri = data.getData(); if (pdfUri != null) { // 调用工具方法将Uri转为字节数组 byte[] pdfBytes = convertUriToByteArray(this, pdfUri); if (pdfBytes != null) { // 拿到字节数组后,就可以调用你的服务器上传接口了 uploadPdfToServer(pdfBytes); } } } }
第二步:实现Uri转字节数组的工具方法
因为ACTION_GET_CONTENT返回的是内容Uri(不是本地文件路径),所以必须通过ContentResolver来读取文件内容。下面是封装好的转换方法,还处理了IO异常:
private byte[] convertUriToByteArray(Context context, Uri uri) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 使用try-with-resources自动关闭流,避免资源泄漏 try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { if (inputStream == null) { return null; } // 用缓冲区分批读取文件,避免内存溢出 byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } return outputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); // 这里可以根据业务需求添加异常处理,比如给用户弹出"读取PDF失败"的提示 return null; } }
额外注意事项
- 权限适配:如果你的App目标SDK是Android 10(API 29)及以上,无需申请
READ_EXTERNAL_STORAGE权限——通过ACTION_GET_CONTENT获取的Uri已经被系统授权,直接用ContentResolver读取即可。低版本则需要提前申请存储权限。 - 大文件优化:如果遇到超大PDF,直接转成字节数组可能会导致内存溢出。这种情况建议直接用
InputStream流的方式上传,不用把整个文件读到内存里。 - Google Drive兼容性:从Google Drive返回的Uri就是标准的内容Uri,上面的方法完全适配这种场景,不用额外处理路径问题。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

