Android 7+ 中 ar_IL 的 WebView 问题?

WebView issue with ar_IL in Android 7+?

各位开发者,

我正在创建一个应用程序,Android Vitals 显示一个奇怪的错误:

Issue: at (wrapper dynamic-method) System.Object.3(intptr,intptr,intptr)

android.runtime.JavaProxyThrowable: System.ArgumentOutOfRangeException: Not a valid calendar for the given culture.

这个问题只发生在以下配置ar_IL,我可能是错的,但我猜它的意思是Arabic来自以色列。我不知道如何测试它,甚至不知道如何在模拟器中选择它,因为我不会说任何接近它的语言。这是错误的预览:

另外,我上传了错误的视频(实际上应用程序被冻结并且永远不会打开):

https://youtu.be/aLXwEBHZnwA

这很奇怪,因为我的应用程序已在不同国家/地区下载,包括一些 讲阿拉伯语的国家/地区,例如 沙特阿拉伯,而我从未下载过关于我的应用程序因 X 或 Y 原因无法运行或从未打开的任何投诉或通知。

我将添加一些我认为已连接到 WebView 且正在打开且可能有用的代码部分:

OnCreate C# 函数:

public static bool RUN_ONCE { get; set; } = true;

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    Rating();

    RequestWindowFeature(WindowFeatures.NoTitle);

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);

    WebView = FindViewById<WebView>(Resource.Id.webView);

    WebView.Settings.DomStorageEnabled = true;
    WebView.Settings.JavaScriptEnabled = true;
    WebView.Settings.AllowFileAccessFromFileURLs = true;

    WebView.AddJavascriptInterface(new CallJSInterface(this), "CSharp");

    WebView.SetWebViewClient(new JavaScriptWebViewClient($"javascript:firstExecTime({RUN_ONCE.ToString().ToLowerInvariant()});"));

    WebView.LoadUrl("file:///android_asset/index.html");

    if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
    {
        StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder()
                            .PenaltyDeathOnFileUriExposure()
                            .Build();
        StrictMode.SetVmPolicy(policy);
    }

    RunOnce();
}

private void RunOnce()
{
    if (RUN_ONCE)
    {
        RUN_ONCE = false;
    }
}

firstExecTime JS中的函数:

function firstExecTime(firstTime) {
    isFirstTime = firstTime;
    if (firstTime)
        setFirstTimeValues();
}

我有这个在 JS 中设置不同语言的过程(目前只支持英语和西班牙语):

const androidLngLocation = "file:///android_asset/js/lang/";
var langs = ["en", "es"];
var langCode = "";
var currentTranslation;
var errorLng = false;

var translate = function (jsdata) {
    currentTranslation = jsdata;
    $("[tkey]").each(function () {
        $(this).html(jsdata[$(this).attr("tkey")]);
    });
    $("[tkey-title]").each(function () {
        $(this).prop("title", jsdata[$(this).attr("tkey-title")]);
    });
    $("[tkey-placeholder]").each(function () {
        $(this).prop("placeholder", jsdata[$(this).attr("tkey-placeholder")]);
    });
    $("[tkey-btn-ok]").each(function () {
        $(this).data("btn-ok-label", jsdata[$(this).attr("tkey-btn-ok")]);
    });
    $("[tkey-btn-cancel]").each(function () {
        $(this).data("btn-cancel-label", jsdata[$(this).attr("tkey-btn-cancel")]);
    });
    $("[tkey-data-title]").each(function () {
        $(this).data("title", jsdata[$(this).attr("tkey-data-title")]);
    });
};

langCode = navigator.language.substr(0, 2);

try {
    if (!langs.includes(langCode))
        langCode = "en";
    $.getJSON(`${androidLngLocation}${langCode}.json`, translate);
}
catch (e) {
    errorLng = true;
    setTimeout(function () {
        if (!isValueInArray(langs, langCode))
            langCode = "en";
        $.getJSON(`${androidLngLocation}${langCode}.json`, translate);
    }, 125);
}

function isValueInArray(arr, val) {
    inArray = false;
    for (i = 0; i < arr.length; i++)
        if (val === arr[i])
            inArray = true;
    return inArray;
}

此外,这里有一个link的logcat:

https://1drv.ms/t/s!AhpAtowYvNcyj-Fo1sIQUhu12Ce3Jw

我从 Android 资源中为应用程序的某些小部分(例如 NavigationDrawer)提供了一些英语和西班牙语的翻译,但我没有任何其他翻译,默认语言是英语案例.

有没有人经历过类似的事情?你知道怎么修吗?或者你知道它在模拟器中的语言是什么样子的,我可以自己测试吗?感谢您的支持。

我找到了一种解决问题的方法:

if (new string[] { "ar_IL" }.Contains(Java.Util.Locale.Default.ToString()))
{
    System.Globalization.CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
}

我认为它可能对其他人有帮助,您需要做的是在数组中定义 Play 商店为您提供的不兼容语言,并将其替换为您的默认语言或您拥有的任何兼容语言。

我从这个讨论中得到了这个解决方法:

https://bugzilla.xamarin.com/show_bug.cgi?id=59077

似乎这个错误是多种语言,比如泰语,gcnew 提供了解决方法。