Xamarin.Android Webview无法打开文件,但文件上传可以正常工作(需要C#代码)

时间:2019-05-11 05:03:43

标签: xamarin.android android-webview

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

活动代码在这里:

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

    }

}

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,请确保您的 protected void Application_Start() { // Set up the sentry SDK _sentry = SentrySdk.Init(o => { o.Dsn = new Dsn(ConfigurationManager.AppSettings["SentryDsn"]); }); } protected void Application_Error() { var exception = Server.GetLastError(); // Capture unhandled exceptions SentrySdk.CaptureException(exception); } protected void Application_End() { // Close the Sentry SDK (flushes queued events to Sentry) _sentry?.Dispose(); } 已启用javascript并正确设置了WebViewClient。

WebView

然后,我们应该实现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"); 事件(使用DownloadManager下载文件)

WebView.Download