首页 > 解决方案 > 无法在 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;
    }
}

}

标签: c#androidwebviewxamarin.androidandroid-4.4-kitkat

解决方案


有人可以尝试解决如何调用 sanitize 方法。如果我们再次添加 [Export] 和 [JavascriptInterface] 它可以正常工作,但理想情况下不需要这些注释来调用 sanitize。

官方文档JavascriptInterface所述,如果 targetSdkVersion 为 17(Android 4.2) 或更高版本,则必须为方法添加注释。

注意:如果您将 targetSdkVersion 设置为 17 或更高,则必须将 @JavascriptInterface 注释添加到您希望 JavaScript 可用的任何方法(该方法也必须是公共的)。如果您不提供注释,则在 Android 4.2 或更高版本上运行时,您的网页将无法访问该方法。


推荐阅读