Android:使用文件路径

时间:2017-06-21 10:45:31

标签: java android file pdf fileoutputstream

我正在开发一个可以接收PDF文件的应用程序。该应用程序当前将收到的文件保存为内部应用程序目录中的byte [],然后我可以访问它的本地路径。

我现在希望能够将该数据转换为PDF文件,然后再保存到外部存储器中。

我可以使用下面的代码执行此操作,但是当我尝试访问它时,我被告知格式无效。任何想法如何解决这个问题?

// ---------- EXPORT IMAGE TASK ----------
private class ExportPDF extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... voids) {
        String pathToExternalStorage = Environment.getExternalStorageDirectory().toString();
        File appDirectory = new File(pathToExternalStorage + "/" + getString(R.string.app_name));
        if (!appDirectory.exists()) {
            appDirectory.mkdirs();
        }

        File imageFile = new File(appDirectory.getAbsolutePath() + "/PDF_" + filename.hashCode() + ".pdf");
        if (!imageFile.exists()) {
            try {
                FileOutputStream fos = new FileOutputStream(imageFile.getPath());
                fos.write(new File(localPath).toString().getBytes());
                fos.close();
            } catch (FileNotFoundException e) {
                Log.e(TAG, e.toString());
            } catch (IOException e) {
                Log.e(TAG, e.toString());
            }
        }
        return imageFile.getAbsolutePath();
    }

    @Override
    protected void onPostExecute(String aString) {
        exportPDF(aString);
    }
}

private void exportPDF(String filePath) {
    Uri imageUri = Uri.parse(filePath);
    Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
    sharingIntent.setDataAndType(imageUri, "application/pdf");
    startActivity(sharingIntent);
}

1 个答案:

答案 0 :(得分:0)

Option Explicit

Public StatusRYGView                As New clsTskUpdate
Public RowIDChanged                 As Long
Public Const myDateFormat           As String = "dd/mm/yy"
Public Dict As Object ' use a Dictionary to save previous values of all UniqueID and Text5 values ("Status")


Sub StatusRYGFieldUpdate()

Set StatusRYGView.ProjApp = Application
PaneClose ' should close the Split window (to make sure run-time error 1100 won't happen

Application.Calculation = pjManual
Application.ScreenUpdating = False

If UpdateViewFlag Then
    FormatModifiedTasks ' call FormatModifiedTasks Sub, which updates all tasks that Text5 ("Status") were modified
End If

Application.Calculation = pjAutomatic
Application.ScreenUpdating = True

End Sub

这段代码的作用是一步一步:

  • 根据某个值(fos.write(new File(localPath).toString().getBytes());
  • 创建File个对象
  • 创建该文件路径的字符串表示形式(new File(localPath)
  • 创建该文件路径的字符串表示形式的new File(localPath).toString()byte[]
  • new File(localPath).toString().getBytes()写入byte[]

结果是FileOutputStream标识的文件包含其他文件的路径。这不是有效的PDF。

我的猜测是您尝试将imageFile的内容复制到localPath,而且此代码不会这样做。

更简单,更快速且占用空间更少的解决方案是使用imageFile直接从FileProvider向PDF查看器提供PDF,而不是制作数据的第二个副本。