c# - 无法在 Android 4.4 中从 javascript 调用 Sanitize 方法,而在 Android 4.1 中同样有效
问题描述
无法在 Android 4.4 中从 javascript 调用 Sanitize 方法,而在 Android 4.1 中同样如此。我们可以从 android 4.1 调用 Sanitize 方法,例如 Foo.sanitize('test message') ,但在 4.4 中同样不起作用。有人可以尝试解决如何调用 sanitize 方法。如果我们再次添加 [Export] 和 [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;
}
}
}
解决方案
有人可以尝试解决如何调用 sanitize 方法。如果我们再次添加 [Export] 和 [JavascriptInterface] 它可以正常工作,但理想情况下不需要这些注释来调用 sanitize。
如官方文档JavascriptInterface
所述,如果 targetSdkVersion 为 17(Android 4.2) 或更高版本,则必须为方法添加注释。
注意:如果您将 targetSdkVersion 设置为 17 或更高,则必须将 @JavascriptInterface 注释添加到您希望 JavaScript 可用的任何方法(该方法也必须是公共的)。如果您不提供注释,则在 Android 4.2 或更高版本上运行时,您的网页将无法访问该方法。
推荐阅读
- python - 如何使用(x,y)python将行拟合到2个数组
- r - 指定外部库但不在函数级别
- python - Pandas 合并具有相同 id 行的列表
- angular - 以角度的静态方法访问 ag-Grid ColumnApi
- mysql - 在 Mysql for Postgresql 中替代“set @myvariable = value”
- intellij-idea - 如何在 IntelliJ IDEA 的拆分选项卡中打开新文件?
- mysql - MySQL CREATE TABLE FROM VIEW 与 PRIMARY KEY
- python - 如何从 Python 中的字符串中提取数字并返回一个列表?
- software-design - 在洋葱、六边形或干净架构中,域模型是否可以包含与数据库中的域模型不同的属性?
- ios - 我想在我的通知中显示图像,我试图在扩展通知服务中这样做,但它没有用