【发布时间】:2021-10-30 06:23:05
【问题描述】:
我有一个 webview 应用程序,它具有 pdf 下载功能,可以从一些不同的网站下载 pdf 文件。我想知道如何在下载后立即打开pdf。我的应用中还没有 pdf 阅读器,因为我不知道如何应用它。
我已阅读我提出的类似问题的所有答案,但并非所有答案都适用。问题是 pdf 的名称是基于上传者设置的,因此每个访问的网站 pdf 文件的名称都会有所不同。
在下面的代码中,下载的pdf文件的生成名称是根据网站上的pdf名称生成的,不是我自己确定的。
是否可以根据代码打开pdf文件还是我应该更改代码?
package com.example.app;
public class WebViewActivity extends AppCompatActivity {
String url = "";
NetworkChangeListener networkChangeListener = new NetworkChangeListener();
private boolean multiple_files = true;
private static String file_type = "*/*";
private ValueCallback<Uri> file_data;
private ValueCallback<Uri[]> file_path;
private final static int file_req_code = 1;
private static final String TAG = WebViewActivity.class.getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
webView = findViewById(R.id.webView);
WebSettings appwebsettings = webView.getSettings();
appwebsettings.setLoadsImagesAutomatically(true);
appwebsettings.setJavaScriptEnabled(true);
appwebsettings.setAllowContentAccess(true);
appwebsettings.setAllowFileAccess(true);
url = getIntent().getStringExtra("URL_NAME");
webView.loadUrl(url);
webView.requestFocus();
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
swipeRefreshLayout.setEnabled(false);
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
});
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_DENIED){
Log.d("permission", "permission denied to WRITE_EXTERNAL_STORAGE - requesting it");
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions,1);
}
}
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition,
String mimeType, long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setMimeType(mimeType);
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie",cookies);
request.addRequestHeader("User-Agent",userAgent);
request.setDescription("Downloading File");
request.setTitle(URLUtil.guessFileName(url,contentDisposition,mimeType));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,
URLUtil.guessFileName(url, contentDisposition, mimeType));
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
downloadManager.enqueue(request);
Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_SHORT).show();
}
});
@Override
protected void onStart() {
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkChangeListener, filter);
super.onStart();
}
@Override
protected void onStop() {
unregisterReceiver(networkChangeListener);
super.onStop();
}
@Override
public void onBackPressed() {
if(webView.canGoBack()){
webView.goBack();
}else {
finish();
super.onBackPressed();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
}
这是我的 Webview 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".WebViewActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
提前谢谢你。
【问题讨论】:
-
请在您最喜欢的搜索引擎上进行快速搜索。已经有很多可用的解决方案。最常见和最简单的是使用意图。 intent.setDataAndType(Uri.fromFile(file),"application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
-
@ImranAli 我真的尝试了几天应用其他问题给出的答案。但这些答案不能适用。或者也许我在应用答案时是错误的。如果您知道如何应用它,请帮助我。我将不胜感激。
-
问题是因为我使用“request.setTitle(URLUtil.guessFileName(url,contentDisposition,mimeType));”。如果标题原样,我不知道如何正确设置pdf名称。
-
您可以自己提供文件名。或者记住文件名。它的 URLUtil.guessFileName(url,contentDisposition,mimeType)。我真的不理解大惊小怪。当然,您可以使用 ACTION_VIEW 让用户为您的文件选择 pdf 查看器。请张贴代码。您至少有两种可能性来获取文件所需的 uri 以放入意图中。
-
我试试这个代码: File file = new File(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url,contentDisposition,mimeType)); Uri 路径 = Uri.fromFile(file);意图 pdfOpenintent = new Intent(Intent.ACTION_VIEW); pdfOpenintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); pdfOpenintent.setDataAndType(path, "application/pdf");尝试 { startActivity(pdfOpenintent); } catch (ActivityNotFoundException e) { } 但它不起作用。
标签: java android android-studio pdf openpdf