无法在Android 4.4中调用来自javascript的Sanitize方法,其中Android 4.1中也是如此。我们可以从Android 4.1中调用Sanitize方法,如Foo.sanitize('test message'),其中同样的方法在4.4中不起作用。有人可以尝试解决如何调用sanitize方法。 如果我们添加[导出]& [JavascriptInterface]再次使用它,但理想情况下不需要这些注释来调用sanitize。
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Webkit;
using Java.Interop;
using Android.Net;
namespace WebViewJavaScriptInterface
{
[Activity (Label = "Mono WebView ScriptInterface", MainLauncher = true)]
public class JavaScriptInterfaceActivity : Activity
{
const string html = @"<html><body><p>This is a paragraph.</p><button type=""button"" onClick=""Foo.sanitize('test message')"">Click Me!</button></body></html>";
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
WebView view = FindViewById<WebView> (Resource.Id.web);
view.Settings.JavaScriptEnabled = true;
view.SetWebChromeClient (new WebChromeClient ());
view.AddJavascriptInterface ((Java.Lang.Object)new Foo (this), "Foo");
view.LoadData (html, "text/html", null);
}
}
class Foo : Java.Lang.Object, UrlQuerySanitizer.IValueSanitizer
{
public Foo (Context context)
{
this.context = context;
}
Context context;
[Export]
[JavascriptInterface]
public void Bar (string message)
{
Console.WriteLine ("Foo.Bar invoked!");
Toast.MakeText (context, "This is a Toast from C#! " + message.ToString(), ToastLength.Short).Show ();
}
public string Sanitize(string value)
{
Console.WriteLine("Santizie.Bar invoked!");
return string.Empty;
}
}
}
答案 0 :(得分:0)
有人可以尝试解决如何调用sanitize方法。如果我们添加[导出]&amp; [JavascriptInterface]再次使用它,但理想情况下不需要这些注释来调用sanitize。
如official documentation中所述,如果targetSdkVersion为17(Android 4.2)或更高版本,则必须向方法添加JavascriptInterface
注释。
警告:如果您已将targetSdkVersion设置为17或更高,则必须将@JavascriptInterface注释添加到您希望JavaScript可用的任何方法(该方法也必须是公共的)。如果您未提供注释,则在Android 4.2或更高版本上运行时,您的网页无法访问该方法。