1

我在打开我保存到我的 android 应用程序中的文件系统的 pdf 时遇到问题。

我有一个从服务器序列化字节数组的休息调用,然后我将此字节数组保存为我的 pdf 文件。这部分工作正常,我可以导航到保存 pdf 的目录并打开它一切正常

但是,当尝试通过手机 GS4(POLARIS Office View 5)或 Adob​​e Reader 上的默认 pdf 查看器从我的应用程序中打开 pdf 时,两个应用程序都无法打开文件。POLARIS 返回吐司“无法打开此文档” Adob​​e 启动但随后抛出文档路径无效。

下面的代码用于保存我的文件。

private String createFile(AttachmentDTO dto) {
    String fileExtention = getMimeType(dto);    
    File file = new File(context.getExternalFilesDir(Constants.BASE_EXTERNAL_DIRECTORY_ATTACHMENTS),  dto.getId() + fileExtention);
    FileOutputStream fos;

    try {
        Files.write(dto.getAttachment(), file);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return file.getPath();
}

我的文件的完整路径是

/storage/emulated/0/Android/data/com.rsd.childcare.mobile.client/files/attachments/2.pdf

现在我的假设是两个应用程序都不能因为权限而打开 pdf。但是我的清单中有以下内容

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

我知道在声明 WRITE_EXTERNAL_STORAGE 时您也会获得 READ 权限,但是在 4.2 中他们添加了这个,所以我想我会尝试一下,但仍然没有乐趣。

我“认为”的另一件事是通过调用“getExternalFilesDir”这赋予了对这些文件的 3rd 方应用程序的读取访问权限??!!

下面的代码说明了我如何尝试阅读 pdf

String filePath = Attachment.findAttachmentPath(Integer.parseInt((String) view.getContentDescription()));
        File file = new File(Environment.getExternalStorageDirectory() + filePath);
        Uri path = Uri.fromFile(file);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(path, "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);

如果有人能指出我正确的方向,我将不胜感激

谢谢

4

1 回答 1

1

看来您在确定路径时有一些代码重复——您编写的代码似乎使用不同的代码来确定路径,而不是为Uri构建Intent. 你确定那些匹配吗?

getExternalFilesDir(Constants.BASE_EXTERNAL_DIRECTORY_ATTACHMENTS)用于创建文件,而getExternalStorageDirectory()用于Uri. 您可能希望插入一些Log语句或断点,以确保一切都按预期排列。更好的是,您可能希望稍微巩固一下这个逻辑,这样您就可以确定在两个地方都使用了相同的值。

于 2013-05-08T12:58:40.947 回答