Android webview没有在按钮点击时生成pdf报告

Posted

技术标签:

【中文标题】Android webview没有在按钮点击时生成pdf报告【英文标题】:Android webview not generating pdf report on button click 【发布时间】:2021-10-01 07:06:22 【问题描述】:

我在 android Studio 中使用 WebView 创建了一个网络应用程序。我已经在 android WebView 中加载了一个 WordPress 站点。当我在 chrome 浏览器上加载它时,WordPress 网站会在单击按钮时导出 pdf 报告。

在 chrome 中加载的网站

当我点击 PDF 按钮时显示窗口

最后它开始下载 pdf 文件

生成的 pdf 报告如下所示:

但是当我使用在 WebView 中创建的 Android 应用程序时会出现问题。当我单击 PDF 按钮时,它什么也不做,我得到一个调试日志

D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: true
[InputMethodManagerWrapper.java:68] hideSoftInputFromWindow

我已将清单权限设置为

 uses-permission android:name="android.permission.INTERNET"

代码在这里 private static final String WEB_URL = "http://workmanager.midzonetechnologies.com/";

webView = findViewById(R.id.webView);
    
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setAllowContentAccess(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setAllowFileAccessFromFileURLs(true);
    webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
    webView.getSettings().setBlockNetworkLoads(false);

    webView.getSettings().setAppCacheMaxSize( 10 * 1024 * 1024 ); // 10MB
    webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath() );
    webView.getSettings().setAllowFileAccess( true );
    webView.getSettings().setAppCacheEnabled( true );
    webView.getSettings().setjavascriptEnabled( true );
    webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
    webView.setWebViewClient(new WebViewClient());
    webView.setWebChromeClient(new WebChromeClient());

    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(WEB_URL);

请问是manifest文件权限或运行时权限相关的问题,请给出解决方案。

我在 WebView 中创建的 Android 应用。

【问题讨论】:

你在 Android 11 上测试它吗? 【参考方案1】:

您在 Chrome 中看到的情况是:

注意基于路径的可下载文件:mywebsite.com/randomPath/randomFile**.pdf** 请求下载权限 将文件下载到本地存储 使用 Google 云端硬盘打开 PDF 文件

如果你想要这种行为,你必须在你的应用程序中编写所有这些步骤。

一个快速的解决方案是截取url,检查它是否是pdf文件,然后使用浏览器打开它。

    webView.webviewClient = object : WebViewClient() 
        @TargetApi(Build.VERSION_CODES.N)
        fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest): Boolean 
            val url = request.url.toString()
            if (url.takeLast(4) == ".pdf") 
                startActivity(
                    Intent(
                        Intent.ACTION_VIEW,
                        "https://docs.google.com/gview?embedded=true&url=$request.url"
                    )
                )
                return true
            
            return false
        
    

【讨论】:

在 chrome 浏览器中发生的事情也应该在 WebView 中发生。我认为数据是从数据库中获取的,并且 pdf 文件是动态创建的。所以我们不能使用 url 并让 WebView 做剩下的事情。当我单击 PDF 按钮时,InputMethodManagerWrapper 禁用了软输入模式。请告诉如何解决这个问题。 Webview 无法显示 pdf 文件。 为什么它不能像在 chrome 浏览器中那样工作。请阅读我的完整问题并理解它。【参考方案2】:

您可能必须在此处执行不同的步骤。正如@Florin T. 所说,您首先必须获得您的应用所需的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

在下一步中,您将检测系统是否可以下载任何内容。

可以这样做:

mWebView.setDownloadListener(new DownloadListener() 
public void onDownloadStart(String url, String userAgent,
            String contentDisposition, String mimetype,
            long contentLength) 
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setData(Uri.parse(url));
    startActivity(i);
);

Source here

如果您随后单击 WebView 中的 PDF 按钮,系统应该正在处理您手机上的下载。这意味着您可以像通过 chrome 下载一样打开您的下载。

在最后一步中,您必须从下载中获取保存的位置并启动一个 Intent 以使用本地 PDF 应用程序打开它。这可以通过 android Intent 完成。

【讨论】:

我收到一个错误.....没有找到处理 Intent 的 Activity act=android.intent.action.VIEW dat=blob:workmanager.midzonetechnologies.com/… 我已经删除了网址的“blob:”部分,但下载仍然无法正常工作。 您是否提供了确切的下载链接?是否有可能在该链接后面似乎有下载但不是?您可以通过转到现在的浏览器并输入该链接来验证这一点。如果它打开一个“下载框”(Windows 或 Mac 正常),那么下载应该没问题? 它在windows和android浏览器中下载得很好。仅在 WebView 中出现的问题。 这个帖子可能对你有帮助:***.com/questions/10069050/…

以上是关于Android webview没有在按钮点击时生成pdf报告的主要内容,如果未能解决你的问题,请参考以下文章

android webview和loadData,我可以让后退按钮返回生成的内容吗?

Android 浮动按钮和高级 webview 不起作用

通过Android WebView中的javascript检测点击HTML按钮

Android浮动按钮和高级webview不起作用

android webview中访问带有upload上传控件点击没有效果

如何检测您是不是在android java的webview中点击了youtube播放按钮?