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

如何在Android Studio中向Firebase上传PDF/XLS/DOCX文档?

从本地存储选择文档并上传至Firebase Storage(替代已弃用的StartActivityForResult)

要实现从本地存储选择任意类型文档并上传至Firebase,直接用Activity Result API替代已弃用的StartActivityForResult()即可,以下是完整实现步骤:

1. 配置权限(按需)

针对不同Android版本配置权限:Android 12及以下需添加存储读写权限,Android 13+使用ACTION_OPEN_DOCUMENT无需传统读写权限。在AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

2. 用Activity Result API打开文件选择器

在Activity/Fragment中注册文件选择的Launcher,替代旧的StartActivityForResult():

Kotlin示例

private val pickDocumentLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri: Uri? ->
    uri?.let {
        // 获取到文档Uri后,执行上传逻辑
        uploadToFirebaseStorage(it)
    }
}

// 触发文件选择器的方法,可绑定到按钮点击事件
fun openDocumentPicker() {
    // 设置允许选择的MIME类型,*/*表示支持任意类型文档
    pickDocumentLauncher.launch(arrayOf("*/*"))
}

Java示例

private ActivityResultLauncher<String[]> pickDocumentLauncher = registerForActivityResult(
        new ActivityResultContracts.OpenDocument(),
        uri -> {
            if (uri != null) {
                uploadToFirebaseStorage(uri);
            }
        }
);

// 触发文件选择器
public void openDocumentPicker() {
    pickDocumentLauncher.launch(new String[]{"*/*"});
}

3. 将选中的文档上传至Firebase Storage

实现上传逻辑,处理进度、成功、失败回调:

Kotlin示例

private fun uploadToFirebaseStorage(uri: Uri) {
    val storage = FirebaseStorage.getInstance()
    val storageRef = storage.reference

    // 自定义存储路径和文件名,用时间戳避免重名
    val fileName = "documents/${System.currentTimeMillis()}_${uri.lastPathSegment}"
    val fileRef = storageRef.child(fileName)

    val uploadTask = fileRef.putFile(uri)

    // 监听上传进度
    uploadTask.addOnProgressListener { taskSnapshot ->
        val progress = (100.0 * taskSnapshot.bytesTransferred / taskSnapshot.totalByteCount)
        // 可在此更新UI显示上传进度,比如progressBar.setProgress(progress.toInt())
    }.addOnSuccessListener {
        // 上传成功后获取文件下载链接
        fileRef.downloadUrl.addOnSuccessListener { downloadUri ->
            val downloadUrl = downloadUri.toString()
            // 可将下载链接保存到Firebase Firestore或本地
        }
    }.addOnFailureListener { exception ->
        // 处理上传失败逻辑
        exception.printStackTrace()
    }
}

Java示例

private void uploadToFirebaseStorage(Uri uri) {
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReference();

    String fileName = "documents/" + System.currentTimeMillis() + "_" + uri.getLastPathSegment();
    StorageReference fileRef = storageRef.child(fileName);

    UploadTask uploadTask = fileRef.putFile(uri);

    // 监听上传进度
    uploadTask.addOnProgressListener(taskSnapshot -> {
        double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
        // 更新进度UI
    }).addOnSuccessListener(taskSnapshot -> {
        // 获取文件下载链接
        fileRef.getDownloadUrl().addOnSuccessListener(downloadUri -> {
            String downloadUrl = downloadUri.toString();
            // 保存下载链接
        });
    }).addOnFailureListener(exception -> {
        // 处理上传错误
        exception.printStackTrace();
    });
}

注意事项

  • 如果需要长期访问选中的文档,需在获取Uri后调用contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
  • 确保项目已添加Firebase Storage依赖,比如在build.gradle中:
    // Kotlin
    implementation 'com.google.firebase:firebase-storage-ktx:20.3.0'
    // Java
    implementation 'com.google.firebase:firebase-storage:20.3.0'
    

内容的提问来源于stack exchange,提问作者Shivang Gautam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:25:45