因此,我有一个片段,其中我显示了用户的条款和条件的东西,这些条款和条件是在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加载文档,供用户查看和共享/保存它,同时重用代码,而不是以不同的和不稳定的方式做它?
**更新:我添加了一个广播接收器在下载完成时启动,而不是像我在这里做的那样等待固定的时间。这是一个更好的想法,但仍然不是我想要的。
1条答案
按热度按时间0s0u357o1#
您已经使用了许多遗留工具来完成此任务,但不清楚您是否有业务约束。
如果您的业务用例只是下载pdf并与设备中的另一个android应用程序共享,我会使用
Kotlin Flow
执行异步下载任务。当你下载pdf文件并保存到存储器中时,你可以使用
Kotlin Flow
的回调作为你分享意图的触发器,这样你就不需要任何延迟了。请注意,根据您的业务使用情形,您可以使用
ContentProvider
给予访问应用文件,也可以使用p2p
第三方工具来下载和共享文件。