【问题标题】:Read PDF from application cache从应用程序缓存中读取 PDF
【发布时间】:2012-07-12 11:06:58
【问题描述】:

我的缓存中存储了一个 pdf 文件。我想通过第三方应用程序(Adobe 阅读器)阅读此 pdf。 但我不允许这样做,因为意图无法访问应用程序缓存目录,除非通过存储在 sdcard 中公开 pdf。

是否有任何解决方法可以允许第三方应用从缓存中读取 pdf?

谢谢

【问题讨论】:

  • 你为什么需要/想要!?
  • 你可以从存储在sd卡中读取pdf
  • 客户要求将 PDF 存储在应用程序中而不是 SD 卡上
  • 保持数据私密性和将其交给外部应用程序存在冲突。

标签: android pdf android-intent


【解决方案1】:

第 3 方应用无法访问您应用的缓存目录。

此线程包含几个库链接,可让您在应用程序中显示 PDF 内容:Render a PDF file using Java on Android

【讨论】:

    【解决方案2】:

    是的,很有可能,使用 FileProvider,您可以将文件安全地保存在缓存中,并暂时将文件的访问权限授予查看者。这是一个可以帮助您实施的链接。

    Android 支持库 v4 包含一个名为 FileProvider 的类,它是 ContentProvider 的一个特殊子类。此类通过创建 content:// uri 而不是 file:/// uri 来帮助共享与应用关联的文件。

    内容 URI 允许您使用临时访问权限授予读写访问权限。因此,您可以提供对缓存目录中文件的临时访问权限,而无需我们的应用拥有 WRITE_EXTERNAL_STORAGE 权限。

    您应该做的第一件事是在您的 AndroidManifest 文件中添加一个新的内容提供程序:

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

    FileProvider 只能为您预先指定的目录中的文件生成内容 URI。要指定目录,请在 XML 中指定其存储区域和路径(将文件另存为 res/xml/fileprovider.xml)。

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <cache-path name="image" path="image/"/>
    </paths>
    

    现在您可以将您的应用缓存文件共享给其他应用。要共享文件,您需要向您的意图添加更多行。

    File cacheFile = new File(context.getCacheDir(), "image/yoo.jpg");
    
    Uri uri = FileProvider.getUriForFile(context, "my.package.provider", 
    cacheFile);
    
    Intent intent = ShareCompat.IntentBuilder.from(context)
        .setType("image/jpg")
        .setSubject(context.getString(R.string.share_subject))
        .setStream(uri)
        .setChooserTitle(R.string.share_title)
        .createChooserIntent()
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
    context.startActivity(intent);
    

    首先,您必须获取要共享的缓存文件的引用,在我们的例子中,它的 cacheFile 位于缓存目录 + 图像文件夹中。

    接下来您必须获取此缓存文件的 uri,该 uri 可以使用 FileProvider.getUriForFile 获取。在这里,您必须将 my.package 替换为您的应用程序包名称。不要从最后删除那个 .provider。

    最后,当您创建意图时,只需将标志 Intent.FLAG_GRANT_READ_URI_PERMISSION 添加到您的意图中,以便其他应用可以读取此 uri。

    参考:https://medium.com/androidsrc/share-cache-files-with-other-android-apps-using-fileprovider-897fe5705e45

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @EugenePrimako 请再次查看,我已做出更改。
    猜你喜欢
    • 2011-06-06
    • 2017-09-25
    • 2017-12-08
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多