如何在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
相关产品推荐
相关产品推荐

