我有一个多语言的应用程序与主要语言英语和第二语言阿拉伯语.
如文档中所述,
android:supportsRtl="true"在清单中添加了.left和right属性start,并end分别.strings-ar(和其他资源类似).以上设置正常.改变后的Locale到ar-AE,阿拉伯文字和资源都正确地显示在我的活动.
但是,每次我导航到
ActivityaWebView和/或a时WebViewClient,语言环境,文本和布局方向都会突然恢复为设备默认值.
进一步提示:
Activity有a WebView和/或a WebViewClient(并且我有几个)时才会发生语言环境的突然转变.它不会发生在任何其他活动上.Android 7.0具有多语言环境支持,允许用户设置多个默认语言环境.因此,如果我将主要区域设置为Locale.UK:
然后在导航到时
WebView,语言环境从更改ar-AE为en-GB.
Android 7.0 API更改:
如API更改列表中所示,API 24中的以下类中添加了与语言环境相关的新方法:
Locale:
Configuration:
但是,我正在使用API 23构建我的应用程序,并且我没有使用任何这些新方法.
此外......
问题也出现在Nexus …
android locale android-webview android-7.0-nougat android-chrome
我有一个使用唤醒锁的网络应用程序(见下文) - 我已经注册了原始试用版并将代码添加到我的index.html 中。- 请参阅https://lucid-franklin-4016c2.netlify.com/
当我在最新版本的 Android Chrome 中加载页面时,手机保持唤醒状态,并且我用于此运行应用程序的文本转语音消息工作正常。
我还将其设置为 PWA(服务工作者、清单……- 在灯塔中一切都很好)。然而,在“将页面添加到主屏幕”并从那里加载 PWA 后,手机确实会进入睡眠状态。它会继续计算时间,并可以在后台播放声音文件,但文本转语音功能已停用。
这是预期的行为吗?
我的关键需求是文本到语音转换,而不是让手机保持清醒状态,因为无论如何,地理定位似乎在手机睡眠状态下都可以工作。我还有其他事情可以做吗?
// The wake lock sentinel.
let wakeLock = null;
// Function that attempts to request a wake lock.
export const requestWakeLock = async cb => {
try {
wakeLock = await navigator.wakeLock.request("screen");
wakeLock.addEventListener("release", () => {
console.log("Wake Lock was released");
});
console.log("Wake Lock is active");
} catch (err) {
console.error(`${err.name}, ${err.message}`);
cb({
tag: "error",
payload: "wakeLock not supported"
});
}
};
Run Code Online (Sandbox Code Playgroud) 似乎Android Chrome有一个相当大的错误,有时地址栏隐藏/显示导致固定元素通过浏览器地址栏高度向下/向上移动其边界框.因此,元素在视觉上保持在同一位置,但边界框实际上会发生变化.这使得可点击区域无用,因为它们不再注册(参见下面的图像).
这个错误是间歇性的,但我已经能够通过快速滚动然后突然停止滚动触摸屏幕来非常可靠地复制它.有没有其他人遇到这个,更重要的是,有没有人有一个避免这种行为的解决方案?
在第一张图片中,请注意没有地址栏.向下滚动隐藏.边界框应该是它的位置.
现在使用地址栏,它会将整个边界框向下移动,在这种情况下会偏离视图.这使得按钮的命中区域变得无用.
更新的帖子
问题
我们有各种日志,表明Chrome的后台更新正在终止使用Web视图的应用程序。所有日志都遵循类似的模式;
3034 3049 I ActivityManager: Force stopping com.android.chrome appid=10115 user=-1: installPackageLI
3034 3049 I ActivityManager: Killing 963:com.google.android.googlequicksearchbox:search/u0a80 (adj 500): stop com.android.chrome,installPackageLI
3034 3049 W ActivityManager: Scheduling restart of crashed service com.google.android.googlequicksearchbox/com.google.android.apps.gsa.shared.util.keepalive.StandaloneKeepAlive$KeepAliveService in 1000ms
3034 3049 W ActivityManager: Scheduling restart of crashed service com.google.android.googlequicksearchbox/com.google.android.apps.gsa.nowoverlayservice.DrawerOverlayService in 10999ms
3034 3049 I ActivityManager: Killing 1709:com.my.app/u0a292 (adj 0): stop com.android.chrome,installPackageLI
Run Code Online (Sandbox Code Playgroud)
我从这里的另一个开发人员那里发现了类似的问题;https://seap.samsung.com/forum-topic/activitymanager-kills-our-pro-kiosk-mode-app-chrome-update。它讨论了Knox中提供的API,但我无法确定是否有更多信息。理想情况下,我希望使用本机解决方案或某种AndroidManifest条目来实现这一目的。
我了解,当一个应用程序依赖于另一个应用程序时,可能需要关闭并重新启动才能保持奇偶校验。但是,我们的应用程序是一个全屏活动应用程序,在这种情况下才被启动,这似乎很奇怪,没有解决方法。
问题
我如何等待我们的应用完成(或失去焦点)才能进行更新?我的应用程序设置中缺少什么可以避免诸如此类的问题吗?可能是Webview的使用是问题所在?
应用程式资讯
我们对网络视图的依赖性很可能是第三方广告提供商的依赖性。该应用程序是在Unity中制作的。我可以更改AndroidManifest本身,也可以更新Player和主要Activity的本机版本。如果需要,我也可以编写本机代码。我怀疑这对于本机应用程序也是一个问题。
原始帖子 -标题:确定对Chrome的依赖关系(应用在Chrome更新中被终止。
我注意到,每次Chrome应用获得更新时,我的应用都会被杀死。
Force stopping com.android.chrome appid=10145 user=-1: installPackageLI
Killing 14427:my.application.com/u0a263 (adj 200): stop com.android.chrome,installPackageLI …Run Code Online (Sandbox Code Playgroud) 因此,我们正在Ionic v3 PWA中实现navigator.share()(https://developers.google.com/web/updates/2016/09/navigator-share)。
它可以工作,但是我们遇到了一个我们不知道如何解决的小问题:当 navite 共享选择器弹出时(用户可以选择收件箱、gmail、twitter 等),然后用户按下 android 上的后退按钮(忽略出现的本机模式),该函数不会触发承诺中的任何响应。不是成功,不是错误。
这里的问题是我们在调用 navigator.share 函数之前显示了一个加载微调器,如果用户在那个精确的时刻按下后退按钮,我们无法触发隐藏加载微调器的函数。
这是我们实现该功能的代码部分:
public share(title: string, message: string, url: string) {
// if it's mobile & web (ie: chrome on android)
if (this.isMobileWeb === true) {
this.showLoading();
if ((navigator as any).share) {
(navigator as any).share({
title,
message,
url,
})
.then(() => {
console.log('Success share');
this.hideLoading();
})
.catch((error) => {
console.log('Error share', error);
this.hideLoading();
});
}
else {
console.log('navigator.share() not supported.');
this.hideLoading();
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此实现,如果用户在本机共享模式出现时按下后退按钮,则不会引发成功或错误。这段代码有什么问题吗?
我还尝试在函数内添加另一个回调 …
javascript navigator progressive-web-apps ionic3 android-chrome
我正在 Android-Chrome 上使用语音合成 API。问题是,尽管有 4 种英语语音可用,但无论代码指定什么,浏览器始终使用美国英语。我可以使用其他语言,例如法语,但不能使用其他英语语音,例如 en-AU、GB 或 IN。
此代码从 getVoices 数组中过滤英式英语语音对象,并使用第一个说出单词“tomato”的对象。问题是这个词总是发音为“to-may-lo”而不是“to-mar-to”,这意味着我的文本不押韵。
显示使用的语音对象(在我尝试过的手机上)是 GB 的。
html...
<!DOCTYPE html>
<html lang="en-GB">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Let's not call the whole thing off</title>
<script src="tomato.js" defer></script>
</head>
<body>
<div id="tomato" lang="en-GB">Tomato</div>
<div id="platform"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
还有剧本...
var platform = document.getElementById("platform");
var tomato = document.getElementById("tomato");
var voices = [];
var voicesGB = [];
voices = speechSynthesis.getVoices();
speechSynthesis.onvoiceschanged = function() {
voices = speechSynthesis.getVoices();
voicesGB = voices.filter(voice => /en(-|_)GB/.test(voice.lang));
};
function speak(word) { …Run Code Online (Sandbox Code Playgroud) 我想知道我必须如何配置我的应用程序才能打开它android-app://application.id?
adb shell am start android-app://application.id
Run Code Online (Sandbox Code Playgroud)
该URI_ANDROID_APP_SCHEME如记录似乎不工作。相反,Chrome 和 Firefox 只打开market://我的应用程序的链接。
对于 Chrome,我找到了一个仅描述该intent://方案的文档。
当意图过滤器包含DEFAULT和BROWSABLE类别时,它适用于Firefox。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud) android google-chrome android-intent firefox-android android-chrome
据我所知,event.preventDefault 在 android 中不起作用。那么阻止用户在 android 中 keydown 事件中输入特殊字符的最佳替代方法是什么?注意:输入事件触发时的替换值解决方案很好,但在我的情况下并不能解决问题。
如何在Android的Chrome浏览器中的JavaScript中获取地址栏的高度(在左侧图片中用红色矩形标记)?我需要知道它在向下滚动时消失,因此我需要对此做出反应,因为视口的高度与那时不同。
我已经想出的一种解决方案:
获取初始状态下的视口高度:
var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
地址栏消失后获取视口高度
计算两个值之间的差异
问题是您必须处于第二状态才能知道这一点。
我有一个字体大小为body16px的网页。
在 Android 版 Google Chrome 上,我遇到以下问题:当页面最初加载时,未定义字体大小(因此从正文继承字体大小)的元素中的字体大小大于 16px(如果继续阅读,您将看到,没有明显的方法来计算渲染文本大小的倍数)。当用户向下滚动时,呈现的文本大小更改为 16px。
在上面的屏幕截图中,页面已加载,用户尚未与页面交互。
在上面的屏幕截图中,页面已加载并且用户已与页面进行了交互。注意显示“0% 兴趣”的元素上的字体大小现在更小了
尽管两种字体大小之间存在视觉差异。在用户滚动之前,文本变大,在用户滚动之后,文本变小——字体大小在所有情况下都计算为 16px。
在上图中,我们可以看到字体大小在两种情况下都是 16px,但是两个渲染的文本大小明显不同
如果我更改文本的 ,呈现的文本大小会增加或减少(取决于数字是大于还是小于 16)。在这两种情况下,尽管文本大小与原始文本大小成比例增加。
浏览器似乎将 16px 显示为特定大小,然后在用户滚动时更改此大小。
在这里,我将字体大小增加到 20 像素。虽然字体大小确实增加了,但它与原始渲染的文本大小成比例增加
我不这么认为。我在浏览器中禁用了 javascript 并重新加载了页面,但问题仍然存在。
有没有人知道可能导致这种情况的原因?
我正在使用网络蓝牙技术,我正在尝试将 Android 6.0.1(Galaxy J7 prime) 与 Chrome 中的另一台 Android 设备 6.0.1(Galaxy J5)(版本 60.0.311)连接,它不会扫描任何设备。如何在 Android 版 Chrome 移动版上列出附近或已配对的蓝牙设备?我本机搜索蓝牙设备,它自动连接并显示列表。但它不会在 Chrome 中搜索任何设备。我尝试了许多示例网络蓝牙项目,它没有扫描 Chrome 浏览器上的任何设备。给出一些工作示例项目。
注意: https: //googlechrome.github.io/samples/web-bluetooth/device-info.html ?allDevices=true
我尝试了上面的链接,它没有在 Chrome 上显示任何设备,因此我无法完成我的项目。请指导我解决这个问题
android google-chrome progressive-web-apps web-bluetooth android-chrome
android-chrome ×11
android ×5
javascript ×5
html ×4
css ×3
font-size ×1
ionic3 ×1
kill-process ×1
locale ×1
navigator ×1
wakelock ×1