繁体   English   中英

按下按钮时从资产或原始文件夹中打开 PDF 文件的代码

[英]Code to open a PDF file from within either the assets or raw folder when a button is pressed

在与此问题相关的 stackoverflow 上找到了很多答案,但我无法成功实现其中任何一个。 我猜这是因为人们发布了特定的代码位,而我对 Java 的了解还不够多,无法修改它以适合我的应用程序。

我要的是打开保存在原始文件夹中的 PDF 文件所需的特定代码行(最初是资产文件夹,但这里的答案说资产文件夹中的项目被压缩,PDF 文件应该转到原始文件夹)文件夹)。

从我收集到的其他答案中,首先需要将文件复制到内部存储中才能查看。 这意味着赋予它读写存储权限。

这里的很多答案还向您展示了如何在应用程序中打开它(使用库或 WebView),或者在应用程序启动时自动打开它。 我不想要任何一种行为。 我希望它通过意图在按钮单击时打开(因此它可以使用设备上已有的第三方 PDF 查看器打开)。

我在 Android Studio 中创建了一个简单的应用程序,只有一个活动和一个按钮。 按下时它会显示吐司,所以我知道它设置正确。 我还在每个文件夹(资产和原始)中保存了一个 PDF 文件。 请告诉我如何进行。

主活动.java:

public class MainActivity extends AppCompatActivity {

public void showPDF (View view) {

    Toast.makeText(MainActivity.this, "button pressed", Toast.LENGTH_LONG).show();

}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}}

活动_main.xml:

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="showPDF"
    android:text="Button"
    tools:layout_editor_absoluteX="135dp"
    tools:layout_editor_absoluteY="171dp" />

请帮忙。 我一直在寻找答案超过 4 天,但无济于事。

最初是资产文件夹,但这里的答案说资产文件夹中的项目被压缩,PDF 文件应该转到原始文件夹

这通常不是问题。

从我收集到的其他答案中,首先需要将文件复制到内部存储中才能查看。

这是当今的惯例,假设您所说的内部存储是指 Android SDK 所指的内部存储 然后,您将使用FileProvider使 PDF 可用于 PDF 查看器应用程序。

我还在每个文件夹(资产和原始)中保存了一个 PDF 文件

Context (例如,一个Activity getAssets().open(...)上使用getAssets().open(...)来获取资产上的InputStream ,其中...assets/到 PDF 的相对路径。 因此,如果您的 PDF 在assets/doc.pdf"doc.pdf"传递给open()

或者,在Context上使用getResources().openRawResource()来获取原始资源上的InputStream

将 PDF 复制到本地文件是一个问题:

  • 在您想要的位置创建一个File对象(例如, new File(getFilesDir(), "doc.pdf")

  • 为该文件创建一个FileOutputStream

  • 使用标准 Java 文件 I/O 将字节从InputStream复制到FileOutputStream

然后,您可以配置FileProvider (或子类)以从您保存的任何位置提供 PDF,生成Uri ,并制作ACTION_VIEW Intent以打开 PDF 查看器。

这是一个完整的示例应用程序,演示了所有这些,尽管我在启动 Activity 时启动 PDF 查看器,而不是在单击按钮时启动。

有点晚了,但是,此代码段的路径是原始的,您只能使用此代码访问 pdf 文件。

我希望它可以帮助一些

 private fun openPDFFile() {
    
            val intent = Intent("android.intent.action.GET_CONTENT")
            intent.type = "application/pdf"
            startActivityForResult(intent, OPERATION_CHOOSE_PDF)
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM