android 重用代码共享/保存pdf文档

9udxz4iz  于 2023-02-02  发布在  Android
关注(0)|答案(1)|浏览(102)

因此,我有一个片段,其中我显示了用户的条款和条件的东西,这些条款和条件是在pdf文件的形式,这是从服务器检索。
这是检索pdf并向pdfView提供输入流以显示数据的代码。

class RetrievePDFFromUrl extends AsyncTask<String, Void, InputStream> {
    @Override
    protected InputStream doInBackground(String... strings) {
        InputStream inputStream = null;

        try {
            URL url = new URL(strings[0]);
            HttpURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
            if (urlConnection.getResponseCode() == 200) {
                inputStream = new BufferedInputStream(urlConnection.getInputStream());
            }

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        return inputStream;
    }

    @Override
    protected void onPostExecute(InputStream inputStream) {
        pdfView.fromStream(inputStream).load();
    }
}

到目前为止一切顺利。但现在我必须添加共享和保存文档的功能。问题是我必须使用其他代码来完成任务。由于我不能在不下载的情况下共享文档,所以有点混乱。下面是我如何下载文档的。

private void downloadPDFContent(){
    String fileName = getCurrentDocumentName();;
    String urlToDownload = !secondDocument ? documentUrl1 : documentUrl2;

    File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName);

    if (outputFile.exists()) {
        return;
    }

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlToDownload));
    request.setTitle(fileName);
    request.setMimeType("application/pdf");
    request.allowScanningByMediaScanner();
    request.setAllowedOverMetered(true);

    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);

    DownloadManager downloadManager = (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE);
    downloadManager.enqueue(request);
}

问题来了,当试图共享文档,它只是错误的,把200毫秒的延迟之前,试图共享它,因为没有人知道如何缓慢的连接有时可以,它不会工作。

private void shareDocument() {
    downloadPDFContent();

    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), getCurrentDocumentName());

            Uri uri = FileProvider.getUriForFile(getContext(),
                    getContext().getPackageName() + ".provider", outputFile);

            Intent share = new Intent();
            share.setAction(Intent.ACTION_SEND);
            share.setType("application/pdf");
            share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            share.putExtra(Intent.EXTRA_STREAM, uri);

            startActivity(Intent.createChooser(share, "Share document"));
        }
    }, 200);
}

有没有人有更好的想法,我如何才能实现这三个任务-使用inputstream加载文档,供用户查看和共享/保存它,同时重用代码,而不是以不同的和不稳定的方式做它?

**更新:我添加了一个广播接收器在下载完成时启动,而不是像我在这里做的那样等待固定的时间。这是一个更好的想法,但仍然不是我想要的。

0s0u357o

0s0u357o1#

您已经使用了许多遗留工具来完成此任务,但不清楚您是否有业务约束。
如果您的业务用例只是下载pdf并与设备中的另一个android应用程序共享,我会使用Kotlin Flow执行异步下载任务。
当你下载pdf文件并保存到存储器中时,你可以使用Kotlin Flow的回调作为你分享意图的触发器,这样你就不需要任何延迟了。
请注意,根据您的业务使用情形,您可以使用ContentProvider给予访问应用文件,也可以使用p2p第三方工具来下载和共享文件。

相关问题