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来自以色列。我不知道如何测试它,甚至不知道如何在模拟器中选择它,因为我不会说任何接近它的语言。这是错误的预览:
另外,我上传了错误的视频(实际上应用程序被冻结并且永远不会打开):
这很奇怪,因为我的应用程序已在不同国家/地区下载,包括一些 讲阿拉伯语的国家/地区,例如 沙特阿拉伯,而我从未下载过关于我的应用程序因 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 提供了解决方法。
各位开发者,
我正在创建一个应用程序,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来自以色列。我不知道如何测试它,甚至不知道如何在模拟器中选择它,因为我不会说任何接近它的语言。这是错误的预览:
另外,我上传了错误的视频(实际上应用程序被冻结并且永远不会打开):
这很奇怪,因为我的应用程序已在不同国家/地区下载,包括一些 讲阿拉伯语的国家/地区,例如 沙特阿拉伯,而我从未下载过关于我的应用程序因 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 提供了解决方法。