Xamarin.Android webview 无法打开文件,但文件上传正常(需要 C# 代码)

Xamarin.Android webview does not open the file, but file upload works fine (need C# code)

我有 WebView 可以很好地上传文件,但是当我点击文件打开或下载时,没有任何反应。但是在普通浏览器中,当我单击文件时,它会成功打开。代码的目的是在单击文件时打开文件。文件选择 chrome 扩展名就可以了。我认为需要在 WebViewListner 块中添加一些代码。

activity代码在这里:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Net;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Webkit;
using Android.Widget;

namespace smartbookapp
{
    [Activity(Label = "JobActivity")]
    public class JobActivity : Activity
    {

        public WebView webview;
        public IValueCallback mUploadMessage;
        public static ProgressBar progressBar;
        public static int FILECHOOSER_RESULTCODE = 1;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Jobs);

            webview = FindViewById<WebView>(Resource.Id.JobView);
            // show progress bar
            progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar);
            //

            webview.Settings.JavaScriptEnabled = true;
            webview.Settings.SetAppCacheEnabled(true);
            webview.Settings.AllowFileAccess = true;
            webview.Settings.BuiltInZoomControls = true;
            webview.SetWebViewClient(new WebViewListener());

            webview.SetWebChromeClient(new JobWebChromeClient(this));
            webview.LoadUrl("https://smartbook.pk/Jobs/index");

            //
        }



        //
        protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {

            if (requestCode == FILECHOOSER_RESULTCODE)
            {
                if (null == mUploadMessage) return;
                Android.Net.Uri[] result = data == null || resultCode != Result.Ok ? null : new Android.Net.Uri[] { data.Data };
                try
                {
                    mUploadMessage.OnReceiveValue(result);

                }
#pragma warning disable CS0168 // Variable is declared but never used
                catch (Exception e)
#pragma warning restore CS0168 // Variable is declared but never used
                {
                }

                mUploadMessage = null;
            }
            base.OnActivityResult(requestCode, resultCode, data);
        }
        // webview listener code here
        public class WebViewListener : WebViewClient
        {
            public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
            {
                view.LoadUrl(request.Url.ToString());
                return true;
            }
            public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
            {

                progressBar.Progress = view.Progress;
            }
            public override void OnLoadResource(WebView view, string url)
            {

                progressBar.Progress = view.Progress;
            }
            public override void OnPageFinished(WebView view, string url)
            {

                progressBar.Progress = 0;
            }
        }
        public override bool OnKeyDown(Keycode keyCode, KeyEvent e)
        {
            if (keyCode == Keycode.Back && webview.CanGoBack())
            {
                webview.GoBack();

                return true;
            }

            return base.OnKeyDown(keyCode, e);
        }
    }

    // download files from webview

    public class JobWebChromeClient : WebChromeClient
    {

        JobActivity WebViewActivity;
        public JobWebChromeClient(JobActivity activity)
        {
            WebViewActivity = activity;

        }
        public override bool OnShowFileChooser(WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
        {
            WebViewActivity.mUploadMessage = filePathCallback;
            Intent i = new Intent(Intent.ActionGetContent);
            i.AddCategory(Intent.CategoryOpenable);
            i.SetType("*/*");
            WebViewActivity.StartActivityForResult(Intent.CreateChooser(i, "File Chooser"), JobActivity.FILECHOOSER_RESULTCODE);

            return true;
        }

    }

}

首先,请确保您的 WebView 已启用 javascript 并且 WebViewClient 设置正确。

WebView mWebview = FindViewById<WebView>(Resource.Id.webView1);
mWebview.Download += MWebview_Download;
var client = new WebViewClient();
mWebview.Settings.JavaScriptEnabled = true;
mWebview.SetWebViewClient(client);
mWebview.LoadUrl("your url");

然后,我们应该实现WebView.Download事件(使用DownloadManager下载文件)

 private void MWebview_Download(object sender, DownloadEventArgs e)
 {
   var url = e.Url;
   DownloadManager.Request request = new 
  DownloadManager.Request(Uri.Parse(url));

request.AllowScanningByMediaScanner();
request.SetNotificationVisibility(DownloadManager.Request.VisibilityVisibleNotifyCompleted); //Notify client once download is completed!
request.SetDestinationInExternalPublicDir(Environment.DirectoryDownloads, "CPPPrimer");
DownloadManager dm = (DownloadManager)GetSystemService("download");
dm.Enqueue(request);
Toast.MakeText(ApplicationContext, "Downloading File",ToastLength.Long//To notify the Client that the file is being downloaded
            ).Show();
}