Проблема WebView с ar_IL в Android 7+? - PullRequest
0 голосов
/ 21 декабря 2018

Товарищи-разработчики,

Я создаю приложение, и Android Vitals показывает странную ошибку:

Проблема: в (динамический метод-обертка) System.Object.3(intptr, intptr, intptr)

android.runtime.JavaProxyThrowable: System.ArgumentOutOfRangeException: недопустимый календарь для данной культуры.

Эта проблема возникает только в следующей конфигурации ar_IL , я могу ошибаться, но, думаю, это означает Арабский из Израиля .Я не знаю, как проверить это или даже как выбрать его в эмуляторе, так как я не говорю на близком к нему языке.Это предварительный просмотр ошибки:

error

Кроме того, я загрузил видео об ошибке (фактически приложение заморожено и никогда не открывается):

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;
}

Кроме того, вот ссылка на logcat:

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

У меня естьнекоторые переводы на английский и испанский с ресурсов Android для некоторых небольших разделов приложения like NavigationDrawer, но у меня нет другого перевода, и по умолчанию язык английский в любом другом случае.

Кто-нибудь когда-нибудь испытывал нечто подобное?Вы знаете, как это исправить?Или вы знаете, как выглядит язык в эмуляторе, и я мог бы протестировать сам?Спасибо за вашу поддержку.

1 Ответ

0 голосов
/ 29 декабря 2018

Я нашел обходной путь для своей проблемы:

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

Я считаю, что это может помочь другим людям, что вам нужно сделать, это определить несовместимые языки, которые Play Store предоставляет вам в массивеи замените его на используемый по умолчанию или любой другой совместимый, который у вас есть.

Я получил этот обходной путь из этого обсуждения:

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

Кажется, ошибка является множественнойВ таких языках, как тайский, обходной путь был предоставлен gcnew .

...