从资产创建文件并获取其路径

时间:2014-06-19 17:46:54

标签: android file assets

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

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

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

    到目前为止我得到的是:

    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);”中遇到异常。 (没有相应的文件和目录)。我以为代码在那里创建了一个文件?

2 个答案:

答案 0 :(得分:0)

  1. 将文件复制到其他应用程序可以使用与this问题中描述的过程类似的过程访问的公共位置。

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

  3. 构建意图以查看您的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);
    

    }

答案 1 :(得分:0)

目录是否存在?

如果没有,它将发送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" />