PDF文件显示空使用改造2

时间:2018-08-18 07:59:39

标签: android retrofit2

我正在开发一个应用程序,该应用程序正在下载PDF文件,将其保存到内部存储中,然后使用FileProvider在其他应用程序中打开该文件。

注意:这可能是一个重复的问题,我已经遍历了StackOverflow上的大多数问题,但仍未找到解决方案。

该文件可以很好地下载,但是当我打开它时,它是空的。 下载的文件大小为30 kb,有5页,但全部为空。 最初,我认为它为空是因为另一个应用程序没有打开文件的权限,但是我做了另一件事检查它是否是权限问题。我已经将文件保存到外部存储中,但是它是空的。因此,这意味着这不是许可问题。

请注意: 除pdf文件外,还有一些.xls文件,当我在excel android应用程序中打开这些文件时,它说无法打开该文件。这表明在写入字节流时存在一些问题。

Retrofit Interface.java

@GET(ApiConstants.END_POINT_DOWNLOAD_DOCUMENT)
@Streaming
Call<ResponseBody> downloadDocument(@Query("bucket") String bucket, @Query("filename") String fileName);

下载文件的代码:在这里,我正在检查文件是否已存在,然后返回该文件,否则请下载该文件。

public LiveData<Resource<File>> openOrDownloadFile(String bucket, String fileName) {
        MutableLiveData<Resource<File>> documentLiveData = new MutableLiveData<>();
        documentLiveData.postValue(Resource.loading(null));
        Context context = MyApp.getInstance();
        final File file = new File(context.getFilesDir(), fileName);
        if (file.exists()) {
            documentLiveData.postValue(Resource.success(file));
        } else {
            Call<ResponseBody> call = apiService.downloadDocument(bucket, fileName);
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    if (response.isSuccessful()) {
                        appExecutors.diskIO().execute(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    InputStream inputStream = null;
                                    OutputStream outputStream = null;
                                    try {
                                        byte[] fileReader = new byte[4096];
                                        inputStream = response.body().byteStream();
                                        outputStream = new FileOutputStream(file);
                                        while (true) {
                                            int read = inputStream.read(fileReader);
                                            if (read == -1) {
                                                break;
                                            }
                                            outputStream.write(fileReader, 0, read);
                                        }
                                        documentLiveData.postValue(Resource.success(file));
                                        outputStream.flush();
                                    } catch (IOException e) {
                                        documentLiveData.postValue(Resource.error("Error: Unable to save file/n"+e.getLocalizedMessage(), null));
                                    } finally {
                                        if (inputStream != null) {
                                            inputStream.close();
                                        }

                                        if (outputStream != null) {
                                            outputStream.close();
                                        }
                                    }
                                } catch (IOException e) {
                                    Log.e(AppConstants.TAG, e.getMessage(), e);
                                    documentLiveData.postValue(Resource.error("Error: Unable to save file/n"+e.getLocalizedMessage(), null));
                                }
                            }
                        });
                    } else {
                        documentLiveData.postValue(Resource.error("Unable to download file", null));
                    }
                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                    documentLiveData.postValue(Resource.error(t.getLocalizedMessage(), null));
                }
            });
        }

        return documentLiveData;
    }

片段代码

private void onItemClickListener(Document document) {
        mDocumentsViewModel.openORDownloadFile(document.getType(), document.getName()).observe(this, new Observer<Resource<File>>() {
            @Override
            public void onChanged(@Nullable Resource<File> fileResource) {
                binding.setResource(fileResource);
                if (fileResource.status == Status.SUCCESS) {
                    openFile(fileResource.data);
                }
            }
        });


    }

    void openFile(File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
        intent.setDataAndType(uri, mDocumentsViewModel.getMimeType(file.getAbsolutePath()));
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        PackageManager pm = getActivity().getPackageManager();
        if (intent.resolveActivity(pm) != null) {
            startActivity(intent);
        } else {
            Toast.makeText(getActivity(), "This file cannot be opened on this device. Please download some compatible app from play store", Toast.LENGTH_SHORT).show();
        }
    }

以下是版本: ext.retrofit_version =“ 2.4.0” ext.okhttp_version =“ 3.8.0”

我正在为这个问题而苦苦挣扎,如果您能指出这个问题,那将是一个很大的帮助。谢谢。

更新:问题出在后端API。我的代码是正确的。一旦他们在那边解决了问题,它就开始在我这边工作,没有任何变化。

0 个答案:

没有答案