Net8.0的MAUI开发的安卓应用C#和WebView控件打印功能及其交互的方法

最近用VS2022的MAUI开发一个安卓应用,一切都很顺利,但在操作WebView的控件上,发现C#并不能执行WebView控件嵌套html页面里面js的print()打印功能,查了下,好象安卓本身也不支持,需要改写 WebView控件的  ShouldOverrideUrlLoading方法,俱体这样

假设你的webView控件命名为:webView那么,第一步,新建一个类,这个类必须放在安卓专有的目录下:我是放在 项目\Platforms\Android\CustomWebViewClient.cs

CustomWebViewClient.cs源码如下:

using Android.Content;
using Android.Print;
using Android.Webkit;
using Java.Net;
using Microsoft.Maui.Platform;
using Newtonsoft.Json;
using System.Net;

namespace myapp
{
	public class CustomWebViewClient : WebViewClient
	{
		public override void OnPageFinished(Android.Webkit.WebView view, string url)
		{
			base.OnPageFinished(view, url);
			view.Settings.JavaScriptEnabled = true;//启用js
		 



		}

		public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, IWebResourceRequest request)
		{
			string url = request.Url.ToString();

			if (url.StartsWith("weixin://"))
			{

				Launcher.OpenAsync(new Uri(url));
				return true; // 表示已处理 URL 加载
			}
			else if (url.Contains("Logout"))
			{
				// 在这里实现跳转到 Login 页面
				var loginPage = new Login(); // 创建登录页面实例
				App.Current!.MainPage = new NavigationPage(loginPage); // 设置登录页面为当前页面

				return true; // 表示已处理 URL 加载
			}
			//启动打印
			else if (url.Contains("print"))
			{


				var printManager = Platform.CurrentActivity.GetSystemService(Context.PrintService) as PrintManager;
				PrintDocumentAdapter printAdapter = view.CreatePrintDocumentAdapter("MyDocument");
				printManager.Print("Document", printAdapter, new PrintAttributes.Builder().Build());

				return true; // 表示已处理 URL 加载
			}

			return false; // 没有处理 URL 加载,让 WebView 正常加载
		}
	}
}

第二步,让你的vewView控件加载这个类

建一个只有安卓才能运行的方法(其实maui开发IOS也不现实,因为还需要你有台mac,还要手动打开XCODE,还要在mac调用他的模拟器,更至命的是开发出来的布局惨不忍睹,安卓应用还可以!):

    注意里面的webView就是对应你要操作的WebView控件名,这个要换成你自己的控件名

#if ANDROID
        private void OnWebViewHandlerChanged(object sender, EventArgs e)
        {
             
            if (webView.Handler is Microsoft.Maui.Handlers.WebViewHandler handler)
            {
                Android.Webkit.WebView nativeWebView = (Android.Webkit.WebView)handler.PlatformView;
                nativeWebView.SetWebViewClient(new CustomWebViewClient());
            }
        }

#endif

第三步:在 构造函数里,俱体可以在InitializeComponent();下面加载这个OnWebViewHandlerChanged方法

#if ANDROID
			 
			 webView.HandlerChanged += OnWebViewHandlerChanged;
			 
	

#endif

 第四步:利用js的 window.location.href = "****"; 就是你的webView嵌入的thml5页面 ,如果想跟C#交互,一定要利用这个 window.location,至于还有什么方法触发,目前不清楚,如果你想用JS的打印,你不能直接在html5 的js里面直接写print();这样无法触发ShouldOverrideUrlLoading,要写成这样window.location.href =‘print’, 这个print是你自定义的,并不是说一定要写成print才能触发打印功能,你可以写复杂一点,如myprint等等关键词,然后在C#遇到这个print关键字就会拦截触发ShouldOverrideUrlLoading里面的操作,启动安卓手机的打印功能,我总共加了三个,一个是跳转微信支付的页面,一个是跳转登录页面,然后就是打印功能

以上是html5页面跟C#互动的方法,准确的说是html5利用window.location.href 的值传参给C#页面,由C#改写的ShouldOverrideUrlLoading方法,判断url值作出判断来执行相关功能,执行完以后返回true,意思是告诉系统,我自己处理完毕了,不需要你再执行原来window.location.href...的代码了

至于C#怎么操作html5页面JS的方法和函数,注意不能直接调用print(),除了这个,一般的自定义方法,都可以,这个官方有现成的就是:

await webView.EvaluateJavaScriptAsync("yourAction();");

如果需要传参给html5页面,则需要这样写:

string title="warning";
string message="你还示登录";
string buttonText="退出";
string script = $"logOut({{ type: title: '{title}', message: '{message}', buttonText: '{buttonText}' }});";
await webView.EvaluateJavaScriptAsync(script);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值