返回

如何在 Android 设备上打开 GmsDocumentScanningResult.Pdf 对象?

Android

## 在 Android 设备上打开 GmsDocumentScanningResult.Pdf 对象

简介

扫描重要文档后,你可能希望在 Android 设备上查看和处理 PDF 文件。本文档将指导你完成在 Android 设备上打开 GmsDocumentScanningResult.Pdf 对象的步骤,并解决常见错误。

步骤

1. 设置文件提供程序

要与其他应用程序共享 PDF 文件,你需要在 AndroidManifest.xml 中配置文件提供程序:

<application>
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>
</application>

2. 配置提供程序路径

provider_paths.xml 中,将缓存目录设置为文件提供程序的提供路径:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <cache-path
        name="cache"
        path="." />
</paths>

3. 创建 FileProvider.Uri

使用 FileProvider.getUriForFile() 方法为 PDF 文件创建内容提供程序 URI:

val pdfUri = FileProvider.getUriForFile(context, "${context.packageName}.provider", pdfFile)

4. 创建意图并启动

创建带有 PDF URI 的意图,并使用 startActivity() 方法启动默认 PDF 查看器:

val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(pdfUri, "application/pdf")
startActivity(intent)

解决错误

FileUriExposedException

这个错误表示文件 URI 已公开给其他应用程序。要解决此问题,请确保你在 AndroidManifest.xml 中正确配置了文件提供程序。

IllegalArgumentException: Failed to find configured root that contains

这个错误表明文件提供程序无法找到包含 PDF 文件的配置根目录。确保 provider_paths.xml 中的路径与 PDF 文件的实际位置相对应。

其他建议

  • 使用 try-catch 块来处理 FileUriExposedException 和其他异常。
  • 在 Android 11 及更高版本中,你需要在应用程序的 targetSdkVersion 中声明 android:requestLegacyExternalStorage="true"
  • 确保 PDF 文件具有正确的 MIME 类型(即 "application/pdf")。
  • 使用日志记录来调试问题,并检查是否已正确授予应用程序文件读写权限。

结论

遵循这些步骤,你将能够在 Android 设备上轻松打开 GmsDocumentScanningResult.Pdf 对象。通过正确配置文件提供程序和处理常见错误,你可以确保与其他应用程序安全共享和查看 PDF 文件。

常见问题解答

1. 如何创建 GmsDocumentScanningResult.Pdf 对象?

答:使用 DocumentScanner 类扫描文档后,调用 getPdf() 方法来获取 GmsDocumentScanningResult.Pdf 对象。

2. 为什么我的 PDF 文件不能在其他应用程序中打开?

答:确保你已正确配置了文件提供程序并授予了应用程序文件读写权限。

3. 如何处理 FileUriExposedException 错误?

答:检查 AndroidManifest.xml 中的文件提供程序配置,确保它已正确限制对 PDF 文件的访问。

4. 如何在 Android 11 或更高版本中解决文件访问问题?

答:在应用程序的 targetSdkVersion 中声明 android:requestLegacyExternalStorage="true"

5. 如何自定义 PDF 查看器?

答:要自定义 PDF 查看器,你可以创建自定义 PdfViewerActivity 并提供自己的 PDF 查看器实现。