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

时间:2017-05-22 19:30:44

标签: java android pdf android-intent

在与此问题相关的stackoverflow上找到了不少答案,但我无法成功实现其中任何一个。我猜这是因为人们发布了特定的代码,我不知道几乎足够的Java来修改它以适应我的应用程序。

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

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

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

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

MainActivity.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);
}}

activity_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天的答案而无济于事。

2 个答案:

答案 0 :(得分:0)

  

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

这通常不是问题。

  

我从其他答案中得知,首先需要将文件复制到内部存储空间才能查看。

这就是现在的惯例,假设内部存储是指what the Android SDK refers to as internal storage。然后,您可以使用FileProvider使PDF查看器应用程序可以使用PDF。

  

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

getAssets().open(...)上使用Context(例如,Activity)以获得资产上的InputStream,其中...assets/内的相对路径{1}}到PDF。因此,如果您的PDF位于assets/doc.pdf,请将"doc.pdf"传递给open()

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

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

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

  • 为该文件创建FileOutputStream

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

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

Here is a complete sample app演示了所有这些,虽然我在启动活动时启动PDF查看器,而不是点击按钮。

答案 1 :(得分:0)

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

我希望对您有所帮助

import React, { Fragment, useEffect } from "react";
import { BrowserRouter as Router, Route, Switch, MemoryRouter } from "react-router-dom"; 
...

<Router>
        <Fragment>
          <Route exact path="/" component={Landing} />
          <section className="container">
            <Alert />
            <Switch>
              <Route exact path="/register" component={Register} />
              <Route exact path="/login" component={Login} />
              <PrivateRoute exact path="/scene1" component={Scene1} />
              <MemoryRouter>
                <PrivateRoute exact path="/garbage" component={Garbage} />
                <PrivateRoute exact path="/scene3" component={Scene3} />
                <PrivateRoute exact path="/portal1scene3" component={Portal1Scene3} />
                <PrivateRoute exact path="/scene4" component={Scene4} />
                <PrivateRoute exact path="/scene6" component={Scene6} />
                <PrivateRoute exact path="/scene5" component={Scene5} />
                <PrivateRoute exact path="/scene2" component={Scene2} />
                <PrivateRoute exact path="/portal1scene2" component={Portal1Scene2} />
              </MemoryRouter>
            </Switch>
          </section>
        </Fragment>
</Router>