【问题标题】:Create file from assets and get its path从资产创建文件并获取其路径
【发布时间】:2014-06-19 17:46:53
【问题描述】:

我想使用外部库显示存储在 assets 文件夹中的 PDF。这个库需要一个文件的路径。

我读到存储在 assets 文件夹中的 pdf 没有存储为文件。我需要的是

  1. 将 pdf 文件从资产读取到(临时)文件对象中
  2. 为外部 pdf-viewer-library 获取该对象的路径

到目前为止,我得到的是以下内容:

stream = getAssets().open("excerpt.pdf");
BufferedReader reader = new BufferedReader(
                new InputStreamReader(stream));

不幸的是,我不确定下一步该做什么......

编辑: 我尝试了以下代码:

private void copyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;
try {
    files = assetManager.list("");
} catch (IOException e) {
    Log.e("tag", "Failed to get asset file list.", e);
  }
 for(String filename : files) {
    InputStream in = null;
    OutputStream out = null;
    try {
      in = assetManager.open(filename);

      String dirout= Environment.getExternalStorageDirectory().getAbsolutePath() + "/X/Y/Z/" ; 
      File outFile = new File(dirout, filename);

      out = new FileOutputStream(outFile);
      copyFile(in, out);
      in.close();
      in = null;
      out.flush();
      out.close();
        out = null;
      } catch(IOException e) {
          Log.e("tag", "Failed to copy asset file: " + filename, e);
         }       
       }
     }
 ...

我在“out = new FileOutputStream(outFile);”中遇到异常(没有相应的文件和目录)。我以为代码在那里创建了一个文件?

【问题讨论】:

  • 这个外部库接受InputStream 作为输入?
  • @Wakim 我正在使用的外部库是这个:github.com/jblough/Android-Pdf-Viewer-Library 它接受 pdf 文件的路径作为字符串。
  • 我建议使用InputStream,因为从资源中检索InputStream 很容易(就像您使用openRawResource 所做的那样)。我不知道,但不可能从资源中获取文件路径,因为它们是用 apk 编译的,但是有一个解决方法...你可以得到这个BufferedReader,存储在设备存储中并获取路径文件。这不是最好的解决方案,但有效:)
  • 检查这个答案,它可能会帮助你stackoverflow.com/questions/8474821/…
  • 当目录 /X/Y/Z 不存在时,您首先必须使用 mkdirs() 创建它们。 new FileOutPutStream 将创建文件。不是目录。

标签: android file assets


【解决方案1】:

目录是否存在?

如果没有,它会发送一个 IOException。

只是为了确保,试试这个方法:

final File directory = new File("/sdcard/X/Y/Z/");
if (!directory.exists()) {
    directory.mkdirs();
}

如果父目录不存在,它将创建它们。如果它们存在,它将返回 false 并且不会删除其中的内容。在此之后,只需按照您之前的方式继续操作即可。

File outFile = new File(directory, filename);

不要忘记将权限添加到您的 AndroidManifest!

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

【讨论】:

    【解决方案2】:
    1. 使用类似于this 问题中描述的过程将文件复制到其他应用程序可以访问的公共位置。

    2. 保留对您为启动 Intent (Intent.ACTION_VIEW) 而创建的外部文件的引用。

    3. 建立一个 Intent 来查看您的 pdf,例如:

       public void viewPdf(File YOUR_PUBLIC_FILE_FROM_STEP_1) {
      
       PackageManager packageManager = getPackageManager();
       Intent viewPdf = new Intent(Intent.ACTION_VIEW);
       viewPdf.setType("application/pdf");
       List<ResolveInfo> list =packageManager.queryIntentActivities(viewPdf,PackageManager.MATCH_DEFAULT_ONLY);
      
      // Check available PDF viewers on device
      if (list.size() > 0) {
           Intent from_external_app = new Intent(Intent.ACTION_VIEW);
           from_external_app.setDataAndType(Uri.fromFile(YOUR_PUBLIC_FILE_FROM_STEP_1),
                              "application/pdf");
           from_external_app.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
           startActivity(from_external_app);
      

      }

    【讨论】:

    • 感谢您的建议,我尝试了类似的方法但不起作用,请检查我编辑的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多