0

我创建了一个 openPDF 类,它以字节数组作为输入,并使用 Adob​​e Reader 显示 PDF 文件。代码:

private void openPDF(byte[] PDFByteArray) {


    try {
        // create temp file that will hold byte array
        File tempPDF = File.createTempFile("temp", ".pdf", getCacheDir());
        tempPDF.deleteOnExit();

        FileOutputStream fos = new FileOutputStream(tempPDF);
        fos.write(PDFByteArray);
        fos.close();

        Intent intent = new Intent();
           intent.setAction(Intent.ACTION_VIEW);
           Uri uri = Uri.fromFile(tempPDF);
           intent.setDataAndType(uri, "application/pdf");
           intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);     

           startActivity(intent);


    } catch (IOException ex) {
        String s = ex.toString();
        ex.printStackTrace();
    }
}

当我通过 intent 时,来自 adobe reader 的错误是“Invalid file path”。我阅读了与在 android 中下载和查看 PDF 相关的所有其他帖子,但帮助很大。有什么建议么?

4

2 回答 2

1

我认为问题在于其他应用程序无法访问您应用程序的私有数据区域(如缓存目录)中的文件。

候选解决方案:

  1. 将文件的模式更改为 MODE_WORLD_READABLE 以便其他应用程序可以读取它

    ...
    String fn = "temp.pdf";
    Context c = v.getContext();
    FileOutputStream fos = null;
    try {
        fos = c.openFileOutput(fn, Context.MODE_WORLD_READABLE);
        fos.write(PDFByteArray);
    } catch (FileNotFoundException e) {
        // do something
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (fos!=null) {
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    String filename = c.getFilesDir() + File.separator + fn;
    File file = new File(filename);
    Uri uri = Uri.fromFile(file);
    intent.setDataAndType(uri, "application/pdf");
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);     
    startActivity(intent);
    ...
    
  2. 或将 pdf 文件写入 /sdcard 分区。

    您可以使用 android.os.Environment API 来获取路径,并记得将权限添加到您应用的 AndroidManifest.xml 文件中。

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

问候

陈子腾

于 2012-08-03T08:52:38.940 回答
0

我制作了这段代码来使用 Adob​​e 的应用程序打开一个存在于 Dowloads 文件夹中的特定 .pdf 文件

    File folder = new File(Environment.getExternalStorageDirectory(), "Download");
    File pdf = new File(folder, "Test.pdf");

    Uri uri = Uri.fromFile(pdf);

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.adobe.reader");
    intent.setDataAndType(uri, "application/pdf");
    startActivity(intent);

这个对我有用。所以我猜你的问题可能是临时文件。尝试将文件写入 sdcard。为此,您需要添加android.permission.WRITE_EXTERNAL_STORAGE到您的 AndroidManifest.xml。

于 2012-09-26T13:13:59.700 回答