作为 Android .apk 一部分的 PDF 文件

Posted

技术标签:

【中文标题】作为 Android .apk 一部分的 PDF 文件【英文标题】:Pdf files as part of Android .apk 【发布时间】:2011-02-22 04:54:33 【问题描述】:

我必须构建一个显示 pdf 文件列表的 android 应用程序。这些 pdf 文件应该是安全的,换句话说 - 应用程序的用户不应该能够通过任何方式(复制/剪切/打印...等)获取 pdf 内容的副本。我现在的问题是

    我应该如何将 pdf 文件的内容与 .apk 文件一起发送。 如果我们以 diff 格式(原始/字节码)发送文件的内容,我应该如何将文件转换回 pdf 以及我应该将文件放在已安装机器上的什么位置以确保它是安全的。李>

仅供参考,我将锁定当前版本的 Adob​​e Redaer 作为 pdf 查看器来查看 pdf 文件,因为它不允许复制/粘贴/打印。

这是我正在开发的第一个 Android 应用程序。所以,我是一个Android新手。任何帮助将不胜感激。

谢谢, 纳文

【问题讨论】:

您需要接受这样一个事实,即提取 PDF 非常简单,并围绕该现实制定您的业务计划。 @Chris:嗨,克里斯,我没有完全理解你吗?您的意思是说无论它们存储在机器上的什么位置,都可以轻松提取 pdf 文件?请帮助我理解。谢谢。 是的,它们很容易提取。如果您将它们交给另一个应用程序进行显示,那就更是如此。您不能将策略建立在信任手机的基础上。 【参考方案1】:

也许你应该把它存储在res/raw folder

【讨论】:

我无法在此处复制 pdf 文件,因为它会引发以下错误:[2011-02-24 18:22:13 - CSGRealizeTab] res\raw\CSGSample.pdf: Invalid file name : 必须只包含 [a-z0-9_.] 如果我将它放在 assets 文件夹中,我只能以字节格式读取放置在那里的文件。你知道任何其他方式来实现这一点吗?非常感谢 文件名中有大写字母,必须全部小写。【参考方案2】:

您可以将此(这些)pdf文件复制到资产文件夹中,因此您的文件将成为您应用程序的一部分,无法在外部访问,您也可以将它们视为普通文件(即以任何方式打开) pdf查看器在您的情况下)。每当您想访问上下文文件时,您都可以调用context.getAssets()

希望这些信息对您有所帮助。

更新:这是我用来在下载目录中打开文件的代码,如果安装在手机上,此代码可以在任何兼容的 pdf 阅读器中打开 pdf 文件,使用 Adob​​e Reader 测试。您将需要资产文件夹中 pdf 文件的 URI 来运行代码。

String fileName = pdfUrl.substring(pdfUrl.lastIndexOf("/"));

        Log.i("fileName", "" + fileName);
        File file = new File("/sdcard/download" + fileName);
        // File file = new
        // File("/sdcard/download/airtel_latest000.mp3");

        Intent intent;
        if (file.exists()) 

            Uri path = Uri.fromFile(file);

            intent = new Intent(Intent.ACTION_VIEW);

            intent.setDataAndType(path, "application/pdf");

            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            downloaded = true;

         else 

            intent = new Intent(Intent.ACTION_VIEW);

            intent.setData(Uri.parse(pdfUrl));

            downloaded = false;
        
        try 
            startActivityForResult(intent, 5);

         catch (ActivityNotFoundException e) 
            Toast.makeText(this, "No Application Available to View PDF",
                    Toast.LENGTH_SHORT).show();
        

【讨论】:

感谢您的回复。我能够通过将 pdf 文件放在此文件夹中来发送它们。但是当我使用 AssetManager 读取它时(我相信这是我们可以读取这些文件夹中文件的唯一方法),我只得到一个 byteStream。这是否意味着当我们放置在此文件夹中时,我们无法读取 pdf 文件。或者我在这里错过了什么?我们还有其他方法可以解决这个问题吗?谢谢, 资产文件夹中的存储是隐藏文件并与您的 apk 捆绑的解决方案。要在 pdf 阅读器中打开文件,您必须有一个 url 或 uri。我正在编辑我的答案以添加我使用的代码,请查看它并在您觉得有用时使用它。 如果您认为将文件放在给定文件夹中可以保护它们,那您就大错特错了。它们可以在有根设备上读取,或者通过将 .apk 复制到 PC、重命名为 .zip 并解压缩。

以上是关于作为 Android .apk 一部分的 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

Android 文件选择器支持pdf,txt apk等文件格式查询

Android 文件选择器支持pdf,txt apk等文件格式查询

在 Android 上从 pdf 生成缩略图

作为 Android CI 的一部分运行一些内存分析

Android APK安装流程(4)--APK加载

Android 安装包要从 APK 变成 AAB 格式了?事情可能并非你想的那样