我们有一款适用于Android设备的Cordova应用,它使用条形码扫描程序插件。应用程序本身在设备就绪时覆盖默认的Android后退按钮:
document.addEventListener("backbutton", onBackKeyDown, false);
问题是当用户通过按后退按钮取消扫描时,相机关闭,应用程序显示webview,然后启动"后退按钮" event(即调用onBackKeyDown函数)。好像在webview本身上按下后退按钮而不是扫描活动。 我们尝试了一些替代方案,例如 - 在开始扫描之前,删除事件监听器:
function startScan() {
document.removeEventListener("backbutton", onBackKeyDown, false);
cordova.plugins.barcodeScanner.scan(
....
但它没有帮助。 我们不能在插件本身上覆盖它,因为它不是一个活动。这意味着我们必须在JavaScript上进行。
大多数人都赞赏任何解决方案。
答案 0 :(得分:0)
你还在吗?我自己的后退按钮有问题... 我也使用条码扫描器插件进行phonegap,并为后退按钮设置事件监听器。
我最终做的是添加一个标志,我在每次扫描时设置为true,然后每当调用onBackKeyDown函数时 - 如果为true,则重置为false,而不执行其余的函数...
var in_barcode_scan = false;
function onBackKeyDown() {
if (in_barcode_scan) {
in_barcode_scan = false;
} else {
//do whatever you need when a legit back button is triggered.
}
}
function startScan() {
in_barcode_scan = true;
cordova.plugins.barcodeScanner.scan(.....
}
我现在自己有其他问题(取消条形码扫描程序会杀死其他一些事件听众),但这应该可以帮到你......
Jospeh。
答案 1 :(得分:0)
这对我有用,我添加了一个消息,只有通过验证字段的警报取消了扫描仪" result.text]"像这样:
function fileViewSuccess(result) {
console.log("We got a barcode Result: " + result.text);
if(result.cancelled == true){
alert("Was cancelled");
}else{
///do something...
}
}
答案 2 :(得分:0)
如果仍然有人面对此问题(使用android 9和条形码扫描仪) 我设法通过在接收到取消时注册“后退按钮”事件监听器来传递它,并在一秒钟后释放事件监听器。 我的“后退按钮”处理程序什么也不做,只是返回false,因此导航不会发生。 该侦听器仅在android上运行,这对于解决此问题很有帮助。
因此,当从条形码插件获取“取消”时,只需调用以下“ blockBack”功能即可。
function blockBack(){
// stop back button (for 1 s)
// used by barcode camera (when canceling and returnin back)
// was sending the back event to the router, and left the screen
document.addEventListener("backbutton", onBackKeyDown, false);
setTimeout(function(){
document.removeEventListener("backbutton", onBackKeyDown, false)
}, 1000)
function onBackKeyDown() {
// swallow the back button - do nothing
return false;
}
}
答案 3 :(得分:0)
通常是基于观察者的离子作品中的后退按钮。暂时删除它们然后重新分配将阻止页面转到上一页。这对我有用。只需按照下面的代码。 (这是有角度的。只需检查与该块等效的 javascript)
var observers=this.platform.backButton.observers;
this.platform.backButton.observers=[]; //empty array
this.barcode.scan(“Scanning”).then((data)=>{
setTimeout(()=>{this.platform.backButton.observers=observers},500); // important to provide some time to close barcode
});