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

Android新手求教:如何从Firebase获取PDF并在Fragment中展示?

实现滚动栏点击展示对应PDF的完整方案

嘿,刚接触Android和Firebase的话,你的这个需求其实挺典型的,我来给你梳理一套落地的实现方案吧!

第一步:前期准备工作

  • 确保你的Android项目已经接入Firebase:完成Google服务配置(添加google-services.json文件),并在模块级build.gradle中添加必要依赖:
    // Firebase Storage依赖
    implementation 'com.google.firebase:firebase-storage-20.0.1'
    // PDF查看库(常用的AndroidPdfViewer)
    implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'
    // Kotlin用户可选:Coroutines依赖简化异步操作
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
    
  • 上传PDF到Firebase Storage:在Firebase控制台的Storage模块创建专属文件夹(比如pdfs/),将需要展示的PDF文件上传进去。测试阶段可暂时设置宽松的存储规则(上线前务必修改为安全权限):
    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /pdfs/{allPaths=**} {
          allow read: if true;
          allow write: if request.auth != null;
        }
      }
    }
    
  • 在AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    

第二步:获取PDF列表并生成滚动列表

我们用RecyclerView实现滚动栏,步骤如下:

  1. 创建数据类存储PDF核心信息:
    data class PdfItem(val fileName: String, val downloadUrl: String)
    
  2. 从Firebase获取PDF列表(推荐第二种高效方案):
    • 方案一:直接从Storage读取文件列表并获取下载URL
      val storageRef = FirebaseStorage.getInstance().reference.child("pdfs/")
      val pdfList = mutableListOf<PdfItem>()
      val adapter = PdfListAdapter(pdfList) { pdfItem ->
          navigateToPdfViewer(pdfItem.downloadUrl)
      }
      recyclerView.adapter = adapter
      
      storageRef.listAll()
          .addOnSuccessListener { listResult ->
              listResult.items.forEach { item ->
                  item.downloadUrl.addOnSuccessListener { uri ->
                      pdfList.add(PdfItem(item.name, uri.toString()))
                      adapter.notifyItemInserted(pdfList.size - 1)
                  }
              }
          }
          .addOnFailureListener { e ->
              Toast.makeText(this, "加载PDF列表失败:${e.message}", Toast.LENGTH_SHORT).show()
          }
      
    • 方案二:将PDF信息存入Firebase Firestore(更高效,避免多次网络请求)
      在Firestore创建pdfs集合,每个文档存储fileName和downloadUrl字段,直接读取集合数据:
      val db = FirebaseFirestore.getInstance()
      db.collection("pdfs")
          .get()
          .addOnSuccessListener { documents ->
              val pdfList = documents.map { doc ->
                  PdfItem(doc.getString("fileName")!!, doc.getString("downloadUrl")!!)
              }
              adapter.submitList(pdfList)
          }
          .addOnFailureListener { e ->
              Toast.makeText(this, "加载PDF列表失败:${e.message}", Toast.LENGTH_SHORT).show()
          }
      
  3. 实现RecyclerView适配器:
    class PdfListAdapter(
        private val pdfItems: List<PdfItem>,
        private val onItemClick: (PdfItem) -> Unit
    ) : RecyclerView.Adapter<PdfListAdapter.ViewHolder>() {
    
        inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            val tvFileName: TextView = itemView.findViewById(R.id.tv_file_name)
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_pdf_list, parent, false)
            return ViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val pdfItem = pdfItems[position]
            holder.tvFileName.text = pdfItem.fileName
            holder.itemView.setOnClickListener { onItemClick(pdfItem) }
        }
    
        override fun getItemCount() = pdfItems.size
    }
    
    对应列表项布局item_pdf_list.xml:
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/tv_file_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textSize="16sp"
        android:textColor="@android:color/black"/>
    

第三步:点击列表项展示PDF内容

  1. 创建PDF展示页面PdfViewerActivity,布局文件activity_pdf_viewer.xml:
    <com.github.barteksc.pdfviewer.PDFView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pdf_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
  2. 主页面点击回调跳转至PDF展示页:
    private fun navigateToPdfViewer(pdfUrl: String) {
        val intent = Intent(this, PdfViewerActivity::class.java)
        intent.putExtra("EXTRA_PDF_URL", pdfUrl)
        startActivity(intent)
    }
    
  3. 在PdfViewerActivity中加载PDF:
    class PdfViewerActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_pdf_viewer)
    
            val pdfUrl = intent.getStringExtra("EXTRA_PDF_URL") ?: return
            val pdfView = findViewById<PDFView>(R.id.pdf_view)
    
            pdfView.fromUri(Uri.parse(pdfUrl))
                .defaultPage(0)
                .enableSwipe(true) // 允许滑动翻页
                .swipeHorizontal(false) // 垂直滑动模式
                .enableDoubletap(true) // 双击缩放
                .onError { t ->
                    Toast.makeText(this, "加载PDF失败:${t.message}", Toast.LENGTH_SHORT).show()
                }
                .load()
        }
    }
    

优化小建议

  • 添加加载状态:获取PDF列表时显示ProgressBar,加载完成后隐藏,提升用户体验。
  • 本地缓存PDF:可以实现简单的本地缓存逻辑,避免重复下载相同文件,节省用户流量。
  • 权限安全:上线前修改Firebase Storage规则,结合Firebase Authentication限制仅授权用户可读取PDF。

内容的提问来源于stack exchange,提问作者New GenerationFashion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:02:45