如何使用
Uri
在我的应用程序中加载或显示 PDF,而不是使用外部应用程序?我想使用官方的 androidx,pdfviewer
库。
我的应用程序级别
build.gradle
看起来像这样:
dependencies {
implementation("androidx.pdfviewer:pdfviewer:1.0.0-alpha04")
}
这是我的 PDFViewer 可组合项:
@Composable
fun PdfViewer(uri: Uri) {
AndroidView(
factory = { context ->
PDFView(context).apply {
fromUri(uri).defaultPage(0) // Set default page to 0
this.load() // Call load() on the PDFView instance
}
},
modifier = Modifier.fillMaxSize()
)
}
但是,我收到此错误:
未解决的参考 PDFView
androidx.pdfviewer:pdfviewer
不提供任何您可以使用的视图。相反,它提供了一个名为 PdfViewerFragment
的 Fragment。
要在 Compose 中显示
PdfViewerFragment
,您将需要以下依赖项:
implementation("androidx.pdf:pdf-viewer-fragment:1.0.0-alpha04")
implementation("androidx.fragment:fragment-compose:1.8.5")
接下来,您的
style
中定义的应用程序 theme.xml
必须扩展任何 Material3
主题:
<style name="Theme.ComposePlayground" parent="Theme.Material3.Light.NoActionBar" />
最后,您可以使用
AndroidFragment
可组合项来显示 PdfViewerFragment
:
@Composable
fun PdfViewer(modifier: Modifier = Modifier, uri: Uri) {
AndroidFragment<PdfViewerFragment>(
arguments = bundleOf("documentUri" to uri),
modifier = modifier
)
}
PdfViewerFragment
从使用密钥Uri
传递的片段arguments
捆绑包中获取"documentUri"
。请注意,目前只有 Uri
以 开头
content://
file://
支持,因此无法打开在线PDF。
示例:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DocumentViewer() {
var documentUri by remember { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
documentUri = it
}
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
CenterAlignedTopAppBar(
title = { Text("Document Viewer") }
)
FilledTonalButton(
onClick = {
launcher.launch(arrayOf("application/pdf"))
}
) {
Text(text = "Select Document")
}
documentUri?.let {
PdfViewer(
modifier = Modifier.weight(1f).fillMaxWidth(),
uri = it
)
}
}
}
输出:
注:
PdfViewerFragment
仍处于早期开发阶段,可能存在错误。此外,可以使用它的 API 级别也有很多限制。我在 API35
上测试了它,但如果您想将其与较旧的 minSdk
一起使用,您可能需要使用 SDK Extensions。 linter 会告诉您是否需要使用它们。