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

2024-06-04 3850阅读

最近用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 ;
string message="你还示登录";
string buttonText="退出";
string script = $"logOut({{ type: title: '{title}', message: '{message}', buttonText: '{buttonText}' }});";
await webView.EvaluateJavaScriptAsync(script);

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]