如何使用 webview 组件在 App 中下载文件?

Posted

技术标签:

【中文标题】如何使用 webview 组件在 App 中下载文件?【英文标题】:How to Download a file in App with webview component? 【发布时间】:2018-04-29 07:46:18 【问题描述】:

我有一个带有 WebView 的应用程序,我正在尝试下载一个文件。 我只是想下载文件,不需要在 WebView 应用程序中,只需进行下载。我在网上搜索了一些代码,但我没有找到太多关于此的内容。

这是我的 WebView(webview 是一个片段):

public class Example extends Fragment 

public WebView myWebView;

private ProgressBar prg;

SwipeRefreshLayout mySwipeRefreshLayout;


public static Example newInstance() 
    Example fragment = new Example();
    return fragment;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    View rootView = inflater.inflate(R.layout.pagina_principal_layout, container, false);
    myWebView = (WebView) rootView.findViewById(R.id.paginaPrincipalWebView);
    myWebView.loadUrl("http://example.com/");
    prg = (ProgressBar)rootView.findViewById(R.id.progressBar2);
    mySwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipelayout);

    //Esconder barra deslizante lateral de navegação Web.
    myWebView.setVerticalScrollBarEnabled(false);


    //*Ativar javascript
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);


    //*Forçar links para abrir no WebView ao invés do navegador
    myWebView.setWebViewClient(new WebViewClient());


    //Forçar links para abrir no WebView ao invés do navegador.
    mySwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() 
        @Override
        public void onRefresh() 
            myWebView.reload();
            mySwipeRefreshLayout.setRefreshing(false);
        
    );


    //*Voltar histórico ao pressionar botão "voltar"
    myWebView.setOnKeyListener(new View.OnKeyListener()
    
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event)
        
            if(event.getAction() == KeyEvent.ACTION_DOWN)
            
                WebView webView = (WebView) v;

                switch(keyCode)
                
                    case KeyEvent.KEYCODE_BACK:
                        if(webView.canGoBack())
                        
                            webView.goBack();
                            return true;
                        
                        break;
                
            

            return false;
        
    );



    return rootView;


我试过这段代码:

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);

);

此代码将打开浏览器并从中进行下载。此代码中的问题是下载开始,但下载失败。

【问题讨论】:

如果你把网址直接放在浏览器上,你能下载文件吗? 不,我也无法在浏览器中下载,看起来错误在服务器中。我的错,我应该在问这里之前测试一下。但是借此机会,您知道是否可以在 WebView 应用程序中进行下载? 是的,我会回答的 【参考方案1】:

正如我所说,如果你想在 webview 中下载文件,你应该试试这个:

myWebView.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.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name of your file");
        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        dm.enqueue(request);
       //you could show a message here

    
);

不要忘记在清单中添加此权限:

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

如果您使用的是 Android > 5 ,则必须请求权限 :)

链接:https://developer.android.com/training/permissions/requesting.html

【讨论】:

当我按下下载按钮时应用程序崩溃。我这一行:“DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);”我把“getActivity()”放在“getSystemService”之前,因为 webview 是一个片段。 "java.lang.SecurityException: 无权写入 /storage/emulated/0/Download/name of your file: 用户 10080 和当前进程都没有 android.permission.WRITE_EXTERNAL_STORAGE。"我不知道为什么会这样,我把这个放在 AndroidManifest 中: 正如我在回答中所说,您应该请求许可:) 检查我放置的链接 对不起,我之前没有看到链接。我这样做了,现在工作正常,我会做一些测试,但非常感谢你的帮助:) 看起来一切正常。

以上是关于如何使用 webview 组件在 App 中下载文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 WKWebView swift 中下载文档并加载图像(png、jpeg)、pdf、doc 等

如何在GWT中下载文档时在新选项卡上显示消息

在 Shiny 中下载文本并生成 txt 文件

干货|app自动化测试之Andriod WebView如何测试

鸿蒙开发(17)---WebView组件

CodelabWebView组件使用指南