You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:56